aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/scrotty.c82
1 files changed, 53 insertions, 29 deletions
diff --git a/src/scrotty.c b/src/scrotty.c
index d62abb1..730d32f 100644
--- a/src/scrotty.c
+++ b/src/scrotty.c
@@ -62,6 +62,12 @@ static const char* inttable[] =
/**
+ * `argv[0]` from `main`
+ */
+static const char* execname;
+
+
+/**
* Create an PNM-file that is sent to `convert` for convertion to a compressed format
*
* @param fbname The framebuffer device
@@ -140,10 +146,9 @@ static int save_pnm(const char* fbpath, int fbno, long width, long height, int f
* @param fbno The number of the framebuffer
* @param width The width of the image
* @param height The height of the image
- * @param execname `argv[0]` from `main`
* @return Zero on success, -1 on error
*/
-static int save(const char* fbpath, const char* imgpath, int fbno, long width, long height, const char* execname)
+static int save(const char* fbpath, const char* imgpath, int fbno, long width, long height)
{
int pipe_rw[2];
pid_t pid, reaped;
@@ -235,6 +240,46 @@ static int measure(int fbno, long* width, long* height)
/**
+ * Take a screenshot of a framebuffer
+ *
+ * @param fbno The number of the framebuffer
+ * @return Zero on success, -1 on error, 1 if the framebuffer does not exist
+ */
+static int save_fb(int fbno)
+{
+ char fbpath[PATH_MAX];
+ char imgpath[PATH_MAX];
+ long width, height;
+ int i;
+
+ /* Get pathname for framebuffer, and stop if we have read all existing ones. */
+ sprintf(fbpath, DEVDIR "/fb%i", fbno);
+ if (access(fbpath, F_OK))
+ return 1;
+
+ /* Get the size of the framebuffer. */
+ if (measure(fbno, &width, &height) < 0)
+ return -1;
+
+ /* Get output pathname. */
+ sprintf(imgpath, "fb%i.png", fbno);
+ if (access(imgpath, F_OK) == 0)
+ for (i = 2;; i++)
+ {
+ sprintf(imgpath, "fb%i.png.%i", fbno, i);
+ if (access(imgpath, F_OK))
+ break;
+ }
+
+ /* Take a screenshot of the current framebuffer. */
+ if (save(fbpath, imgpath, fbno, width, height) < 0)
+ return -1;
+ fprintf(stderr, "Saved framebuffer %i to %s\n", fbno, imgpath);
+ return 0;
+}
+
+
+/**
* Take a screenshow of all framebuffers
*
* @param argc The number of elements in `argv`
@@ -243,39 +288,18 @@ static int measure(int fbno, long* width, long* height)
*/
int main(int argc, char* argv[])
{
- char fbpath[PATH_MAX];
- char imgpath[PATH_MAX];
- int i, fbno;
- long width, height;
+ int fbno, r;
(void) argc;
+ execname = *argv;
+
/* The a screenshot of each framebuffer. */
for (fbno = 0;; fbno++)
{
- /* Get pathname for framebuffer, and stop if we have read all existing ones. */
- sprintf(fbpath, DEVDIR "/fb%i", fbno);
- if (access(fbpath, F_OK))
- break;
-
- /* Get the size of the framebuffer. */
- if (measure(fbno, &width, &height) < 0)
- return perror(*argv), 1;
-
- /* Get output pathname. */
- sprintf(imgpath, "fb%i.png", fbno);
- if (access(imgpath, F_OK) == 0)
- for (i = 2;; i++)
- {
- sprintf(imgpath, "fb%i.png.%i", fbno, i);
- if (access(imgpath, F_OK))
- break;
- }
-
- /* Take a screenshot of the current framebuffer. */
- if (save(fbpath, imgpath, fbno, width, height, *argv) < 0)
- return perror(*argv), 1;
- fprintf(stderr, "Saved framebuffer %i to %s\n", fbno, imgpath);
+ r = save_fb(fbno);
+ if (r < 0) return perror(execname), 1;
+ if (r > 0) break;
}
return 0;