]> git.jsancho.org Git - gacela.git/blob - src/events.scm
fb21d88f85985d3d911a30cfb33a70ad48a15c86
[gacela.git] / src / events.scm
1 ;;; Gacela, a GNU Guile extension for fast games development
2 ;;; Copyright (C) 2009 by Javier Sancho Fernandez <jsf at jsancho dot org>
3 ;;;
4 ;;; This program is free software: you can redistribute it and/or modify
5 ;;; it under the terms of the GNU General Public License as published by
6 ;;; the Free Software Foundation, either version 3 of the License, or
7 ;;; (at your option) any later version.
8 ;;;
9 ;;; This program is distributed in the hope that it will be useful,
10 ;;; but WITHOUT ANY WARRANTY; without even the implied warranty of
11 ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 ;;; GNU General Public License for more details.
13 ;;;
14 ;;; You should have received a copy of the GNU General Public License
15 ;;; along with this program.  If not, see <http://www.gnu.org/licenses/>.
16
17
18 (define-module (gacela events)
19   #:use-module (gacela sdl)
20   #:export (process-events
21             quit-signal?
22             key?
23             key-pressed?
24             key-released?))
25
26
27 (define (get-event events types)
28   (cond ((null? events) '())
29         (else
30          (let ((res (get-event (cdr events) types))
31                (event (car events)))
32            (cond ((member (assoc-ref event 'type) types) (cons event res))
33                  (else res))))))
34
35 (define (poll-events)
36   (let ((event (SDL_PollEvent)))
37     (cond ((null? event) '())
38           (else (cons event (poll-events))))))
39
40 (define (process-events)
41   (let ((events (poll-events)))
42     (process-screen-events (get-event events `(,SDL_QUIT)))
43     (process-keyboard-events (get-event events `(,SDL_KEYDOWN ,SDL_KEYUP)))))
44
45
46 ;;; Screen Events
47
48 (define quit-signal #f)
49
50 (define (process-screen-events events)
51   (set! quit-signal #f)
52   (cond ((not (null? events))
53          (let ((event (car events)))
54            (cond ((= (assoc-ref event 'type) SDL_QUIT) (set! quit-signal #t))))
55          (process-screen-events (cdr events)))))
56
57 (define (quit-signal?)
58   quit-signal)
59
60
61 ;;; Keyboard Events
62
63 (define keymap (make-hash-table))
64 (define pressed (make-hash-table))
65 (define released (make-hash-table))
66
67 (define (process-keyboard-events events)
68   (clear-key-state)
69   (cond ((not (null? events))
70          (let ((event (car events)))
71            (cond ((= (assoc-ref event 'type) SDL_KEYDOWN) (key-press (assoc-ref event 'key.keysym.sym)))
72                  ((= (assoc-ref event 'type) SDL_KEYUP) (key-release (assoc-ref event 'key.keysym.sym)))))
73          (process-keyboard-events (cdr events)))))
74
75 (define (key? key)
76   (hash-ref keymap (get-keycode key)))
77
78 (define (key-pressed? key)
79   (hash-ref pressed (get-keycode key)))
80
81 (define (key-released? key)
82   (hash-ref released (get-keycode key)))
83
84 (define (key-press key-code)
85   (hash-set! keymap key-code #t)
86   (hash-set! pressed key-code #t)
87   (hash-set! released key-code #f))
88
89 (define (key-release key-code)
90   (hash-set! keymap key-code #f)
91   (hash-set! pressed key-code #f)
92   (hash-set! released key-code #t))
93
94 (define (clear-keymap)
95   (hash-clear! keymap))
96
97 (define (clear-key-state)
98   (hash-clear! pressed)
99   (hash-clear! released))
100
101
102 (define keys
103   '((8 . backspace)
104     (9 . tab)
105     (12 . clear)
106     (13 . return)
107     (19 . pause)
108     (27 . escape)
109     (32 . space)
110     (33 . exclaim)
111     (34 . quotedbl)
112     (35 . hash)
113     (36 . dollar)
114     (38 . ampersand)
115     (39 . quote)
116     (40 . leftparen)
117     (41 . rightparen)
118     (42 . asterisk)
119     (43 . plus)
120     (44 . comma)
121     (45 . minus)
122     (46 . period)
123     (47 . slash)
124     (48 . 0)
125     (49 . 1)
126     (50 . 2)
127     (51 . 3)
128     (52 . 4)
129     (53 . 5)
130     (54 . 6)
131     (55 . 7)
132     (56 . 8)
133     (57 . 9)
134     (58 . colon)
135     (59 . semicolon)
136     (60 . less)
137     (61 . equals)
138     (62 . greater)
139     (63 . question)
140     (64 . at)
141     (269 . kp-minus)
142     (270 . kp-plus)
143     (273 . up)
144     (274 . down)
145     (275 . right)
146     (276 . left)
147     (282 . f1)
148     (283 . f2)
149     (284 . f3)
150     (285 . f4)
151     (286 . f5)
152     (287 . f6)
153     (288 . f7)
154     (289 . f8)
155     (290 . f9)
156     (291 . f10)
157     (292 . f11)
158     (293 . f12)))
159
160 (define keynames (map (lambda (k) (cons (cdr k) (car k))) keys))
161
162 (define (get-keycode keyname)
163   (assoc-ref keynames keyname))
164
165 (define (get-keyname keycode)
166   (assoc-ref keys keycode))