From: Ali Gholami Rudi Date: Sun, 16 Oct 2011 15:30:06 +0000 (+0330) Subject: scrsnap: save framebuffer for selected tags X-Git-Url: https://repo.or.cz/w/fbpad.git/commitdiff_plain/e4df2e7c9aac4a9ca24899d2a2029ac8d0ad0f96 scrsnap: save framebuffer for selected tags Framebuffer memory for tags in TAGS_SAVED are saved and reloaded when switching tags. This is very convenient when using programs that change the framebuffer besides fbpad, like fbpdf. Tested-by: Sara Fauzia --- diff --git a/Makefile b/Makefile index 9fb998c..875b077 100644 --- a/Makefile +++ b/Makefile @@ -5,7 +5,7 @@ LDFLAGS = all: fbpad %.o: %.c $(CC) -c $(CFLAGS) $< -fbpad: fbpad.o term.o pad.o draw.o font.o +fbpad: fbpad.o term.o pad.o draw.o font.o scrsnap.o $(CC) -o $@ $^ $(LDFLAGS) clean: rm -f *.o fbpad diff --git a/README b/README index 8b85f46..c16fbae 100644 --- a/README +++ b/README @@ -19,6 +19,7 @@ m-p show tag summary m-o jump to last tag m-tab show next terminal m-s create a text screenshot (SCRSHOT) +m-y redraw terminal c-m-q quit fbpad ============== ======================================= @@ -39,7 +40,7 @@ green on black terminals. Individual colors can be customized by editing the hex RGB color description of COLOR* macros. Also SCRSHOT macro specifies text screenshot location. -If you are using the scrsnap branch, you can edit TAGS_SAVED to edit -the list of saved terminals. Framebuffer memory is saved and reloaded -for these tags, which is very convenient when you are using programs -that change the framebuffer simultaneously, like fbpdf. +If you are want to use fbpad's scrsnap feature, you can edit TAGS_SAVED +to change the list of saved terminals. Framebuffer memory is saved and +reloaded for these tags, which is very convenient when you are using +programs that change the framebuffer simultaneously, like fbpdf. diff --git a/config.h b/config.h index 4c66fd0..dc64c08 100644 --- a/config.h +++ b/config.h @@ -1,4 +1,5 @@ #define TAGS "xnlhtr01uiva-" +#define TAGS_SAVED "" #define SHELL "ksh" #define MAIL "mailx" #define EDITOR "vi" diff --git a/fbpad.c b/fbpad.c index 3f6272e..d54b591 100644 --- a/fbpad.c +++ b/fbpad.c @@ -20,6 +20,7 @@ #include "pad.h" #include "term.h" #include "util.h" +#include "scrsnap.h" #include "draw.h" #define CTRLKEY(x) ((x) - 96) @@ -27,6 +28,7 @@ #define NTAGS (sizeof(tags) - 1) #define NTERMS (NTAGS * 2) #define TERMOPEN(i) (terms[i].fd) +#define TERMSNAP(i) (strchr(TAGS_SAVED, tags[(i) % NTAGS])) static char tags[] = TAGS; static struct term terms[NTERMS]; @@ -52,7 +54,11 @@ static int cterm(void) static void term_switch(int oidx, int nidx, int show, int save, int load) { int flags = show ? (load ? TERM_REDRAW : TERM_VISIBLE) : TERM_HIDDEN; + if (save && TERMOPEN(oidx) && TERMSNAP(oidx)) + scr_snap(&terms[oidx]); term_save(&terms[oidx]); + if (show && load && TERMOPEN(nidx) && TERMSNAP(nidx)) + flags = scr_load(&terms[nidx]) ? TERM_REDRAW : TERM_VISIBLE; term_load(&terms[nidx], flags); } @@ -121,7 +127,10 @@ static void showtags(void) if (TERMOPEN(altterm(i))) nt++; pad_put(i == ctag ? '(' : ' ', r, c++, FGCOLOR, BGCOLOR); - pad_put(tags[i], r, c++, colors[nt], BGCOLOR); + if (TERMSNAP(i)) + pad_put(tags[i], r, c++, !nt ? BGCOLOR : colors[nt], 15); + else + pad_put(tags[i], r, c++, colors[nt], BGCOLOR); pad_put(i == ctag ? ')' : ' ', r, c++, FGCOLOR, BGCOLOR); } } @@ -159,6 +168,9 @@ static void directkey(void) case 's': term_screenshot(); return; + case 'y': + term_switch(cterm(), cterm(), 1, 0, 1); + return; default: if (strchr(tags, c)) { showtag(strchr(tags, c) - tags); @@ -209,8 +221,10 @@ static int poll_all(void) temp_switch(term_idx[i]); if (ufds[i].revents & POLLIN) term_read(); - if (ufds[i].revents & BADPOLLFLAGS) + if (ufds[i].revents & BADPOLLFLAGS) { + scr_free(&terms[cterm()]); term_end(); + } switch_back(term_idx[i]); } return 0; diff --git a/scrsnap.c b/scrsnap.c new file mode 100644 index 0000000..6ad9c0c --- /dev/null +++ b/scrsnap.c @@ -0,0 +1,57 @@ +#include +#include +#include "config.h" +#include "draw.h" +#include "scrsnap.h" + +#define NSCRS ((sizeof(saved) - 1) * 2) +#define SNAPSZ (1 << 23) + +static char saved[] = TAGS_SAVED; +static char scrs[NSCRS][SNAPSZ]; +static void *owners[NSCRS]; + +static int scr_find(void *owner) +{ + int i; + for (i = 0; i < NSCRS; i++) + if (owners[i] == owner) + return i; + return -1; +} + +static int scr_slot(void) +{ + int index = scr_find(NULL); + return index > -1 ? index : 0; +} + +void scr_snap(void *owner) +{ + int rowsz = sizeof(fbval_t) * fb_cols(); + int scr = scr_slot(); + int i; + for (i = 0; i < fb_rows(); i++) + memcpy(scrs[scr] + i * rowsz, fb_mem(i), rowsz); + owners[scr] = owner; +} + +void scr_free(void *owner) +{ + int scr = scr_find(owner); + if (scr != -1) + owners[scr] = NULL; +} + +int scr_load(void *owner) +{ + int rowsz = sizeof(fbval_t) * fb_cols(); + int scr = scr_find(owner); + int i; + if (scr == -1) + return -1; + for (i = 0; i < fb_rows(); i++) + memcpy(fb_mem(i), scrs[scr] + i * rowsz, rowsz); + owners[scr] = NULL; + return 0; +} diff --git a/scrsnap.h b/scrsnap.h new file mode 100644 index 0000000..9e7e019 --- /dev/null +++ b/scrsnap.h @@ -0,0 +1,3 @@ +void scr_snap(void *owner); +int scr_load(void *owner); +void scr_free(void *owner);