about summary refs log tree commit diff stats
path: root/src/prof_history.h
blob: 253695ec80f6f3afd5161e045b745480e309432a (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
/*
 * prof_history.h
 *
 * Copyright (C) 2012, 2013 James Booth <boothj5@gmail.com>
 *
 * This file is part of Profanity.
 *
 * Profanity is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 *
 * Profanity is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with Profanity.  If not, see <http://www.gnu.org/licenses/>.
 *
 */

#ifndef PROF_HISTORY_H
#define PROF_HISTORY_H

typedef struct p_history_t  *PHistory;

PHistory p_history_new(unsigned int size);
char * p_history_previous(PHistory history, char *item);
char * p_history_next(PHistory history, char *item);
void p_history_append(PHistory history, char *item);

#endif
ber # keys on keyboard without a unicode representation touch:touch-event # mouse, track ball, etc. # update the assume-console handler if you add more variants ] container touch-event [ type:number row:number column:number ] container console [ index:number data:address:array:event ] recipe new-fake-console [ default-space:address:array:location <- new location:type, 30:literal result:address:console <- new console:type buf:address:address:array:character <- get-address result:address:console/deref, data:offset #? $start-tracing #? 1 buf:address:address:array:character/deref <- next-ingredient #? $stop-tracing #? 1 idx:address:number <- get-address result:address:console/deref, index:offset idx:address:number/deref <- copy 0:literal reply result:address:console ] recipe read-event [ default-space:address:array:location <- new location:type, 30:literal x:address:console <- next-ingredient { break-unless x:address:console idx:address:number <- get-address x:address:console/deref, index:offset buf:address:array:event <- get x:address:console/deref, data:offset { max:number <- length buf:address:array:event/deref done?:boolean <- greater-or-equal idx:address:number/deref, max:number break-unless done?:boolean dummy:address:event <- new event:type reply dummy:address:event/deref, x:address:console/same-as-ingredient:0, 1:literal/found, 1:literal/quit } result:event <- index buf:address:array:event/deref, idx:address:number/deref idx:address:number/deref <- add idx:address:number/deref, 1:literal reply result:event, x:address:console/same-as-ingredient:0, 1:literal/found, 0:literal/quit } # real event source is infrequent; avoid polling it too much switch result:event, found?:boolean <- check-for-interaction reply result:event, x:address:console/same-as-ingredient:0, found?:boolean, 0:literal/quit ] # variant of read-event for just keyboard events. Discards everything that # isn't unicode, so no arrow keys, page-up/page-down, etc. But you still get # newlines, tabs, ctrl-d.. recipe read-key [ default-space:address:array:location <- new location:type, 30:literal #? $print default-space:address:array:location #? 1 #? $exit #? 1 #? $start-tracing #? 1 console:address <- next-ingredient x:event, console:address, found?:boolean, quit?:boolean <- read-event console:address #? $print [aaa 1] #? 1 reply-if quit?:boolean, 0:literal, console:address/same-as-ingredient:0, found?:boolean, quit?:boolean #? $print [aaa 2] #? 1 reply-unless found?:boolean, 0:literal, console:address/same-as-ingredient:0, found?:boolean, quit?:boolean #? $print [aaa 3] #? 1 c:address:character <- maybe-convert x:event, text:variant reply-unless c:address:character, 0:literal, console:address/same-as-ingredient:0, 0:literal/found, 0:literal/quit #? $print [aaa 4] #? 1 reply c:address:character/deref, console:address/same-as-ingredient:0, 1:literal/found, 0:literal/quit ] recipe send-keys-to-channel [ default-space:address:array:location <- new location:type, 30:literal console:address <- next-ingredient chan:address:channel <- next-ingredient screen:address <- next-ingredient { c:character, console:address, found?:boolean, quit?:boolean <- read-key console:address loop-unless found?:boolean break-if quit?:boolean assert c:character, [invalid event, expected text] print-character screen:address, c:character chan:address:channel <- write chan:address:channel, c:character loop } ] recipe wait-for-event [ default-space:address:array:location <- new location:type, 30:literal console:address <- next-ingredient { _, console:address, found?:boolean <- read-event console:address loop-unless found?:boolean } ]