source: libcaca/trunk/src/cacaclock.c @ 4777

Last change on this file since 4777 was 4777, checked in by Jean-Yves Lamoureux, 9 years ago
  • Added command line parsing (--dateformat, --font, --help, --version)
  • Center font
File size: 4.4 KB
Line 
1/*
2 *  cacaclock     Text-mode clock display
3 *  Copyright (c) 2011 Jean-Yves Lamoureux <jylam@lnxscene.org>
4 *                All Rights Reserved
5 *
6 *  This program is free software. It comes without any warranty, to
7 *  the extent permitted by applicable law. You can redistribute it
8 *  and/or modify it under the terms of the Do What The Fuck You Want
9 *  To Public License, Version 2, as published by Sam Hocevar. See
10 *  http://sam.zoy.org/wtfpl/COPYING for more details.
11 */
12
13#include "config.h"
14
15#if !defined(__KERNEL__)
16#   include <time.h>   
17#   include <stdio.h>
18#   include <string.h>
19#   include <stdlib.h>
20#endif
21
22#include "caca.h"
23
24#define CACACLOCKVERSION "0.1"
25
26static void usage(int argc, char **argv)
27{
28        char const * const * list;
29
30        fprintf(stderr, "Usage: %s [OPTIONS]... <IMAGE>\n", argv[0]);
31        fprintf(stderr, "Convert IMAGE to any text based available format.\n");
32        fprintf(stderr, "Example : %s -w 80 -f ansi ./caca.png\n\n", argv[0]);
33        fprintf(stderr, "Options:\n");
34        fprintf(stderr, "  -h, --help\t\t\tThis help\n");
35        fprintf(stderr, "  -v, --version\t\t\tVersion of the program\n");
36        fprintf(stderr, "  -f, --font=FONT\t\tUse FONT for time display\n");
37        fprintf(stderr, "  -d, --dateformat=FORMAT\tUse FORMAT as strftime argument (default %%R:%%S)\n");
38}
39
40
41static void version(void)
42{
43        printf(
44                        "cacaclock Copyright 2011 Jean-Yves Lamoureux\n"
45                        "Internet: <jylam@lnxscene.org> Version: %s (libcaca %s), date: %s\n"
46                        "\n"
47                        "cacaclock, along with its documentation, may be freely copied and distributed.\n"
48                        "\n"
49                        "The latest version of cacaclock is available from the web site,\n"
50                        "        http://caca.zoy.org/wiki/libcaca in the libcaca package.\n"
51                        "\n",
52                        CACACLOCKVERSION, caca_get_version(), __DATE__);
53}
54
55
56
57static char* get_date(char *format) {
58        time_t  currtime;                                                   
59        char *charTime = malloc(101);                                     
60
61        time(&currtime);                                                     
62        strftime(charTime, 100,format,localtime(&currtime));
63
64        return charTime;
65}
66
67int main(int argc, char *argv[]) {
68
69        caca_canvas_t *cv;
70        caca_canvas_t *figcv;
71        caca_display_t *dp;
72        uint32_t w, h, fw, fh;
73
74        char *format = "%R:%S";
75        char *font   = "/usr/share/figlet/mono12.tlf";
76
77
78        for(;;)
79        {
80                int option_index = 0;
81                static struct caca_option long_options[] =
82                {
83                        { "font",        1, NULL, 'f' },
84                        { "dateformat",  1, NULL, 'd' },
85                        { "help",        0, NULL, 'h' },
86                        { "version",     0, NULL, 'v' },
87                };
88                int c = caca_getopt(argc, argv, "f:d:hv",
89                                long_options, &option_index);
90                if(c == -1)
91                        break;
92
93                switch(c)
94                {
95                        case 'h': /* --help       */
96                                usage(argc, argv);
97                                return 0;
98                                break;
99                        case 'v': /* --version    */
100                                version();
101                                return 0;
102                                break;
103                        case 'f': /* --font       */
104                                font = caca_optarg;
105                                break;
106                        case 'd': /* --dateformat */
107                                format = caca_optarg;
108                                break;
109                        default:
110                                return 1;
111                                break;
112                }
113        }
114
115
116
117        cv = caca_create_canvas(0, 0);
118        figcv = caca_create_canvas(0, 0);
119        if(!cv || !figcv)
120        { 
121                fprintf(stderr, "%s: unable to initialise libcaca\n", argv[0]);
122                return 1;
123        }
124
125        if(caca_canvas_set_figfont(figcv, font))
126        { 
127                fprintf(stderr, "Could not open font\n");
128                return -1;
129        }
130
131
132        dp = caca_create_display(cv);
133        if(!dp) {
134                printf("Can't open window. CACA_DRIVER problem ?\n");
135                return -1;
136        }
137
138        caca_set_color_ansi(figcv, CACA_DEFAULT, CACA_DEFAULT);
139        caca_clear_canvas(cv);
140        for(;;) {
141                caca_event_t ev;
142
143                while(caca_get_event(dp, CACA_EVENT_KEY_PRESS
144                                        | CACA_EVENT_QUIT, &ev, 1))
145                { 
146                        if(caca_get_event_type(&ev))
147                                goto end;
148                }
149                char *d = get_date(format);
150                uint32_t o = 0;
151
152                // figfont API is not complete, and does not alloq us to put a string
153                // at another position than 0,0
154                // So, we have to create a canvas which will hold the figfont string,
155                // then blit this canvas to the main one at the desired position.
156                caca_clear_canvas(cv);
157                caca_clear_canvas(figcv);
158                while(d[o])
159                { 
160                        caca_put_figchar(figcv, d[o++]);
161                }
162                caca_flush_figlet (figcv);
163                fw = caca_get_canvas_width (figcv);
164                fh = caca_get_canvas_height(figcv);     
165
166                free(d);
167
168                w = caca_get_canvas_width (cv);
169                h = caca_get_canvas_height(cv);
170                uint32_t x = (w/2) - (fw/2);
171                uint32_t y = (h/2) - (fh/2);
172
173                caca_blit(cv, x, y, figcv, NULL);
174                caca_refresh_display(dp);
175                usleep(250000);
176        }
177end:
178
179        caca_free_canvas(figcv);
180        caca_free_canvas(cv);
181        caca_free_display(dp);
182
183        return 0;
184}
Note: See TracBrowser for help on using the repository browser.