scrsnap: save framebuffer for selected tags
authorAli Gholami Rudi <ali@rudi.ir>
Sun, 16 Oct 2011 15:30:06 +0000 (16 19:00 +0330)
committerAli Gholami Rudi <ali@rudi.ir>
Mon, 5 Dec 2011 10:09:29 +0000 (5 13:39 +0330)
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 <sfauzia@fas.harvard.edu>
Makefile
README
config.h
fbpad.c
scrsnap.c [new file with mode: 0644]
scrsnap.h [new file with mode: 0644]

index 9fb998c..875b077 100644 (file)
--- 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 (file)
--- 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.
index 4c66fd0..dc64c08 100644 (file)
--- 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 (file)
--- 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 (file)
index 0000000..6ad9c0c
--- /dev/null
+++ b/scrsnap.c
@@ -0,0 +1,57 @@
+#include <stdlib.h>
+#include <string.h>
+#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 (file)
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);