source: libcaca/trunk/examples/input.c @ 2821

Last change on this file since 2821 was 2821, checked in by Sam Hocevar, 11 years ago

Starting refactoring to get rid of libcucul. The initial reason for the
split is rendered moot by the plugin system: when enabled, binaries do
not link directly with libX11 or libGL. I hope this is a step towards
more consisteny and clarity.

  • Property svn:keywords set to Id
File size: 4.4 KB
Line 
1/*
2 *  input         libcaca text input test program
3 *  Copyright (c) 2006 Sam Hocevar <sam@zoy.org>
4 *                All Rights Reserved
5 *
6 *  $Id: input.c 2821 2008-09-27 13:12:46Z sam $
7 *
8 *  This program is free software. It comes without any warranty, to
9 *  the extent permitted by applicable law. You can redistribute it
10 *  and/or modify it under the terms of the Do What The Fuck You Want
11 *  To Public License, Version 2, as published by Sam Hocevar. See
12 *  http://sam.zoy.org/wtfpl/COPYING for more details.
13 */
14
15#include "config.h"
16
17#if !defined(__KERNEL__)
18#   include <string.h>
19#   include <stdio.h>
20#endif
21
22#include "caca.h"
23
24#define BUFFER_SIZE 75
25#define TEXT_ENTRIES 5
26
27typedef struct textentry
28{
29    uint32_t buffer[BUFFER_SIZE + 1];
30    unsigned int size, cursor;
31} textentry;
32
33int main(int argc, char *argv[])
34{
35    textentry entries[TEXT_ENTRIES];
36    caca_canvas_t *cv;
37    caca_display_t *dp;
38    unsigned int i, e = 0, running = 1;
39
40    cv = caca_create_canvas(0, 0);
41    if(cv == NULL)
42    {
43        printf("Can't create canvas\n");
44        return -1;
45    }
46    dp = caca_create_display(cv);
47    if(dp == NULL)
48    {
49        printf("Can't create display\n");
50        return -1;
51    }
52    caca_set_cursor(dp, 1);
53
54    caca_set_color_ansi(cv, CACA_WHITE, CACA_BLUE);
55    caca_put_str(cv, 1, 1, "Text entries - press tab to cycle");
56
57    for(i = 0; i < TEXT_ENTRIES; i++)
58    {
59        entries[i].buffer[0] = 0;
60        entries[i].size = 0;
61        entries[i].cursor = 0;
62    }
63
64    while(running)
65    {
66        caca_event_t ev;
67
68        for(i = 0; i < TEXT_ENTRIES; i++)
69        {
70            unsigned int j, start, size;
71
72            caca_set_color_ansi(cv, CACA_BLACK, CACA_LIGHTGRAY);
73            caca_fill_box(cv, 2, 3 * i + 4, 2 + BUFFER_SIZE, 3 * i + 4, ' ');
74
75            start = 0;
76            size = entries[i].size;
77
78            for(j = 0; j < size; j++)
79            {
80                caca_put_char(cv, 2 + j, 3 * i + 4,
81                              entries[i].buffer[start + j]);
82            }
83        }
84
85        /* Put the cursor on the active textentry */
86        caca_gotoxy(cv, 2 + entries[e].cursor, 3 * e + 4);
87
88        caca_refresh_display(dp);
89
90        if(caca_get_event(dp, CACA_EVENT_KEY_PRESS, &ev, -1) == 0)
91            continue;
92
93        switch(caca_get_event_key_ch(&ev))
94        {
95            case CACA_KEY_ESCAPE:
96                running = 0;
97                break;
98            case CACA_KEY_TAB:
99            case CACA_KEY_RETURN:
100                e = (e + 1) % TEXT_ENTRIES;
101                break;
102            case CACA_KEY_HOME:
103                entries[e].cursor = 0;
104                break;
105            case CACA_KEY_END:
106                entries[e].cursor = entries[e].size;
107                break;
108            case CACA_KEY_LEFT:
109                if(entries[e].cursor)
110                    entries[e].cursor--;
111                break;
112            case CACA_KEY_RIGHT:
113                if(entries[e].cursor < entries[e].size)
114                    entries[e].cursor++;
115                break;
116            case CACA_KEY_DELETE:
117                if(entries[e].cursor < entries[e].size)
118                {
119                    memmove(entries[e].buffer + entries[e].cursor,
120                            entries[e].buffer + entries[e].cursor + 1,
121                            (entries[e].size - entries[e].cursor + 1) * 4);
122                    entries[e].size--;
123                }
124                break;
125            case CACA_KEY_BACKSPACE:
126                if(entries[e].cursor)
127                {
128                    memmove(entries[e].buffer + entries[e].cursor - 1,
129                            entries[e].buffer + entries[e].cursor,
130                            (entries[e].size - entries[e].cursor) * 4);
131                    entries[e].size--;
132                    entries[e].cursor--;
133                }
134                break;
135            default:
136                if(entries[e].size < BUFFER_SIZE)
137                {
138                    memmove(entries[e].buffer + entries[e].cursor + 1,
139                            entries[e].buffer + entries[e].cursor,
140                            (entries[e].size - entries[e].cursor) * 4);
141                    entries[e].buffer[entries[e].cursor] =
142                                              caca_get_event_key_utf32(&ev);
143                    entries[e].size++;
144                    entries[e].cursor++;
145                }
146                break;
147        }
148    }
149
150    caca_free_display(dp);
151    caca_free_canvas(cv);
152
153    return 0;
154}
155
Note: See TracBrowser for help on using the repository browser.