source: neercs/trunk/src/effects.c @ 3453

Last change on this file since 3453 was 3453, checked in by Pascal Terjan, 11 years ago
  • First incomplete reduction of useless blits
File size: 10.0 KB
Line 
1/*
2 *  neercs        console-based window manager
3 *  Copyright (c) 2006 Sam Hocevar <sam@zoy.org>
4 *                2008 Jean-Yves Lamoureux <jylam@lnxscene.org>
5 *                All Rights Reserved
6 *
7 *  $Id: effects.c 2360 2008-06-11 16:23:46Z jylam $
8 *
9 *  This program is free software. It comes without any warranty, to
10 *  the extent permitted by applicable law. You can redistribute it
11 *  and/or modify it under the terms of the Do What The Fuck You Want
12 *  To Public License, Version 2, as published by Sam Hocevar. See
13 *  http://sam.zoy.org/wtfpl/COPYING for more details.
14 */
15
16#include "config.h"
17
18#include <stdio.h>
19#include <stdlib.h>
20#include <string.h>
21#include <caca.h>
22#include <caca.h>
23#include <time.h>
24#include <sys/wait.h>
25#include <sys/types.h>
26
27#include "neercs.h"
28
29void draw_thumbnails(struct screen_list *screen_list)
30{
31    char const * const *fonts;
32    caca_dither_t *d;
33    caca_font_t *f;
34    uint8_t *buf;
35    int i;
36    int miniw, minih;
37
38    if(screen_list->count)
39    {
40        fonts = caca_get_font_list();
41        f = caca_load_font(fonts[0], 0);
42
43        miniw = caca_get_canvas_width(screen_list->screen[0]->cv)
44            * caca_get_font_width(f);
45        minih = caca_get_canvas_height(screen_list->screen[0]->cv)
46            * caca_get_font_height(f);
47        buf = malloc(4 * miniw * minih);
48
49#if defined(HAVE_ENDIAN_H)
50        if(__BYTE_ORDER == __BIG_ENDIAN)
51#else
52            /* This is compile-time optimised with at least -O1 or -Os */
53            uint32_t const tmp = 0x12345678;
54        if(*(uint8_t const *)&tmp == 0x12)
55#endif
56            d = caca_create_dither(32, miniw, minih, 4 * miniw,
57                                    0xff0000, 0xff00, 0xff, 0x0);
58        else
59            d = caca_create_dither(32, miniw, minih, 4 * miniw,
60                                    0xff00, 0xff0000, 0xff000000, 0x0);
61
62        for(i = 0; i < screen_list->count; i++)
63        {
64            if(!screen_list->screen[i]->changed && !screen_list->changed)
65                continue;
66            caca_render_canvas(screen_list->screen[i]->cv, f, buf,
67                                miniw, minih, miniw * 4);
68            caca_dither_bitmap(screen_list->cv, 20 * i,
69                                caca_get_canvas_height(screen_list->cv) - 6, 19, 6, d, buf);
70            caca_set_color_ansi(screen_list->cv, CACA_WHITE, CACA_BLUE);
71
72            if(screen_list->pty == i)
73                caca_draw_cp437_box(screen_list->cv,20 * i,
74                                     caca_get_canvas_height(screen_list->cv) - 6, 19, 6);
75            caca_printf(screen_list->cv, 20 * i,
76                         caca_get_canvas_height(screen_list->cv) - 6, "(%i)", i+1);
77        }
78
79        caca_free_dither(d);
80        caca_free_font(f);
81
82        free(buf);
83    }
84
85}
86
87/* FIXME, make this stuff more configurable */
88void draw_status(struct screen_list *screen_list)
89{
90    int x = 0, y = caca_get_canvas_height(screen_list->cv) - 1;
91
92
93    caca_set_color_ansi(screen_list->cv, CACA_BLUE, CACA_BLUE);
94    caca_fill_box(screen_list->cv,
95                   x, y,
96                   caca_get_canvas_width(screen_list->cv), 1, '#');
97
98/* Hour */
99    {
100        time_t now = time ((time_t *) 0);
101        struct tm *t = localtime(&now);
102        char hour[256];
103        sprintf(hour, "%02d:%02d", t->tm_hour, t->tm_min);
104
105        caca_set_color_ansi(screen_list->cv, CACA_LIGHTBLUE, CACA_BLUE);
106        caca_printf(screen_list->cv, x, y,
107                     "[");
108
109        caca_set_color_ansi(screen_list->cv, CACA_DEFAULT, CACA_BLUE);
110        caca_printf(screen_list->cv, x+1, y,
111                     hour);
112        caca_set_color_ansi(screen_list->cv, CACA_LIGHTBLUE, CACA_BLUE);
113        caca_printf(screen_list->cv, x + strlen(hour) + 1, y,
114                     "]");
115        x += 7;
116
117    }
118
119/* Window */
120    {
121        char text[256];
122        sprintf(text, "%d/%d", screen_list->pty+1, screen_list->count);
123        x++;
124        caca_set_color_ansi(screen_list->cv, CACA_LIGHTBLUE, CACA_BLUE);
125        caca_printf(screen_list->cv, x, y, "Window:");
126        caca_set_color_ansi(screen_list->cv, CACA_DEFAULT, CACA_BLUE);
127        caca_printf(screen_list->cv, x+8, y, text);
128        x+= 8+strlen(text);
129    }
130
131/* Window Manager */
132    {
133        char text[256];
134
135        switch(screen_list->wm_type)
136        {
137        case WM_CARD:
138            strcpy(text, "card");
139            break;
140        case WM_HSPLIT:
141            strcpy(text, "hsplit");
142            break;
143        case WM_VSPLIT:
144            strcpy(text, "vsplit");
145            break;
146        case WM_FULL:
147        default:
148            strcpy(text, "full");
149            break;
150
151        }
152
153        x++;
154        caca_set_color_ansi(screen_list->cv, CACA_LIGHTBLUE, CACA_BLUE);
155        caca_printf(screen_list->cv, x, y, "WM:");
156        caca_set_color_ansi(screen_list->cv, CACA_DEFAULT, CACA_BLUE);
157        caca_printf(screen_list->cv, x+4, y, text);
158        x+= 4+strlen(text);
159    }
160
161/* Help (must be the last one )*/
162    {
163        char text[256];
164        sprintf(text, "Help: ctrl-a-h");
165        x = caca_get_canvas_width(screen_list->cv) - strlen(text);
166
167        caca_set_color_ansi(screen_list->cv, CACA_DEFAULT, CACA_BLUE);
168        caca_printf(screen_list->cv, x, y, text);
169    }
170
171
172}
173
174
175void draw_help(struct screen_list *screen_list)
176{
177    int w = 65, h = 20;
178    int x = (caca_get_canvas_width(screen_list->cv) - w) / 2;
179    int y = (caca_get_canvas_height(screen_list->cv) - h) / 2;
180
181
182    caca_set_color_ansi(screen_list->cv, CACA_BLUE, CACA_BLUE);
183    caca_fill_box(screen_list->cv,
184                   x, y,
185                   w, h, '#');
186    caca_set_color_ansi(screen_list->cv, CACA_DEFAULT, CACA_BLUE);
187    caca_draw_cp437_box(screen_list->cv,
188                         x, y,
189                         w, h);
190
191    x+=2;
192    y++;
193    caca_printf(screen_list->cv,
194                 (caca_get_canvas_width(screen_list->cv) - strlen(PACKAGE_STRING)) / 2,
195                 y-1,
196                 PACKAGE_STRING);
197    caca_printf(screen_list->cv, x, y++, "Copyright (c) 2006-2008 ");
198    caca_printf(screen_list->cv, x, y++, "              Sam Hocevar <sam@zoy.org>");
199    caca_printf(screen_list->cv, x, y++, "              Jean-Yves Lamoureux <jylam@lnxscene.org>");
200    caca_printf(screen_list->cv, x, y++, "              Pascal Terjan <pterjan@linuxfr.org>");
201    caca_printf(screen_list->cv, x, y++, "");
202    caca_printf(screen_list->cv, x, y++, "");
203    caca_printf(screen_list->cv, x, y++, "All shortcuts are in format 'ctrl-a-X' where X is :");
204    caca_printf(screen_list->cv, x, y++, "n:\t Next window");
205    caca_printf(screen_list->cv, x, y++, "p:\t Previous window");
206    caca_printf(screen_list->cv, x, y++, "w:\t Switch window manager");
207    caca_printf(screen_list->cv, x, y++, "c:\t Create new window");
208    caca_printf(screen_list->cv, x, y++, "m:\t Thumbnails");
209    caca_printf(screen_list->cv, x, y++, "d:\t Detach");
210    caca_printf(screen_list->cv, x, y++, "k:\t Close window and kill associated process");
211    caca_printf(screen_list->cv, x, y++, "h:\t This help");
212    caca_printf(screen_list->cv, x, y++, "");
213    caca_printf(screen_list->cv, x, y++, "");
214    caca_printf(screen_list->cv, x, y++, "See http://libcaca.zoy.org/wiki/neercs for more informations");
215}
216
217int update_window_list(int c, struct screen_list *screen_list)
218{
219    debug("Got %x\n", c);
220
221    switch(c)
222    {
223    case 0x111:
224        if(screen_list->cur_in_list>0)
225            screen_list->cur_in_list--;
226        break;
227    case 0x112:
228        if(screen_list->cur_in_list<screen_list->count-1)
229            screen_list->cur_in_list++;
230        break;
231    case 0xd:
232        screen_list->window_list = 0;
233        screen_list->prevpty = screen_list->pty;
234        screen_list->pty     = screen_list->cur_in_list;
235        break;
236    case 0x22:
237        screen_list->window_list = 0;
238        break;
239    default:
240        break;
241    }
242
243    return 1;
244}
245
246void draw_list(struct screen_list *screen_list)
247{
248    int i;
249    int w = (caca_get_canvas_width(screen_list->cv));
250    int h = (caca_get_canvas_height(screen_list->cv));
251
252    debug("Drawing list\n");
253    caca_set_color_ansi(screen_list->cv, CACA_BLACK, CACA_BLACK);
254    caca_fill_box(screen_list->cv,
255                   0, 0,
256                   w, h, '#');
257    caca_set_color_ansi(screen_list->cv, CACA_DEFAULT, CACA_DEFAULT);
258    caca_draw_cp437_box(screen_list->cv,
259                         0, 0,
260                         w, h);
261
262    caca_printf(screen_list->cv, 2, 1, "Num \tName");
263    for(i = 0; i < screen_list->count; i++)
264    {
265        char line[1024];
266        if(screen_list->cur_in_list == i)
267            caca_set_color_ansi(screen_list->cv, CACA_BLACK, CACA_WHITE);
268        else
269            caca_set_color_ansi(screen_list->cv, CACA_DEFAULT, CACA_DEFAULT);
270        sprintf(line, "%d \t%s", i+1, screen_list->screen[i]->title);
271
272        caca_printf(screen_list->cv, 2, i+3, line);
273    }
274}
275
276/* Close a window by animating it collapsing */
277/* Total close time */
278#define DELAY 500000.0f
279int close_screen_recurrent(struct screen_list* screen_list, struct recurrent* rec, void *user, long long unsigned int t)
280{
281    long long unsigned int delta = t - rec->start_time;
282
283    screen_list->dont_update_coords = 1;
284    rec->kill_me = 0;
285    if(delta>=DELAY)
286    {
287        rec->kill_me = 1;
288        remove_screen(screen_list, screen_list->pty, 1);
289        screen_list->pty = screen_list->prevpty;
290        screen_list->prevpty = 0;
291        screen_list->dont_update_coords = 0;
292    }
293    else
294    {
295        float r = 1 - ((DELAY - (DELAY - delta)) / DELAY);
296        caca_canvas_t *old, *new;
297        struct screen *s = screen_list->screen[screen_list->pty];
298        int w = s->orig_w * r;
299        int h = s->orig_h * r;
300
301        /* libcaca canvas resize function is bugged, do it by hand  */
302        old = s->cv;
303        new = caca_create_canvas(w, h);
304        caca_blit(new, 0, 0, old, NULL);
305        s->cv = new;
306        caca_free_canvas(old);
307        set_tty_size(s->fd, w, h);
308
309        s->w = w;
310        s->h = h;
311
312        s->x =
313            (s->orig_x * r) +
314            ((s->orig_w/2) - s->w/2);
315        s->y =
316            (s->orig_y * r) +
317            ((s->orig_h/2) - s->h/2);
318    }
319    return 1;
320}
Note: See TracBrowser for help on using the repository browser.