summaryrefslogtreecommitdiff
path: root/2d/mouse.scm
diff options
context:
space:
mode:
authorDavid Thompson <dthompson2@worcester.edu>2013-12-01 22:30:37 -0500
committerDavid Thompson <dthompson2@worcester.edu>2013-12-01 22:30:37 -0500
commit8f3718977046ce73e0174b0fa550f91a18106e0d (patch)
treebd65ba472baff5734d4e689d81ffaa7b4fc97468 /2d/mouse.scm
parent936dcbf5179177d38514c3afb5dc185a808db80d (diff)
Move event handlers and signals into their own modules.
* 2d/game.scm (register-event-handler): New procedure. (mouse-*, key-*, window-*): Remove signals. * 2d/window.scm (window-size): New signal. * 2d/mouse.scm: New module. * 2d/keyboard.scm: New module.
Diffstat (limited to '2d/mouse.scm')
-rw-r--r--2d/mouse.scm63
1 files changed, 63 insertions, 0 deletions
diff --git a/2d/mouse.scm b/2d/mouse.scm
new file mode 100644
index 0000000..1c118b2
--- /dev/null
+++ b/2d/mouse.scm
@@ -0,0 +1,63 @@
+;;; guile-2d
+;;; Copyright (C) 2013 David Thompson <dthompson2@worcester.edu>
+;;;
+;;; Guile-2d is free software: you can redistribute it and/or modify it
+;;; under the terms of the GNU Lesser General Public License as
+;;; published by the Free Software Foundation, either version 3 of the
+;;; License, or (at your option) any later version.
+;;;
+;;; Guile-2d 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
+;;; Lesser General Public License for more details.
+;;;
+;;; You should have received a copy of the GNU Lesser General Public
+;;; License along with this program. If not, see
+;;; <http://www.gnu.org/licenses/>.
+
+;;; Commentary:
+;;
+;; Keyboard signals.
+;;
+;;; Code:
+
+(define-module (2d mouse)
+ #:use-module ((sdl sdl) #:prefix SDL:)
+ #:use-module (2d game)
+ #:use-module (2d signals)
+ #:use-module (2d vector2)
+ #:export (mouse-position
+ mouse-last-down
+ mouse-last-up
+ mouse-down?))
+
+(define mouse-last-down (make-signal))
+(define mouse-last-up (make-signal))
+(define mouse-position (make-signal #:init (vector2 0 0)))
+
+(define (mouse-down? button)
+ "Create a signal for the state of BUTTON. Value is #t when mouse
+button is pressed and #f otherwise."
+ (make-signal
+ #:filter (lambda (value old from)
+ (eq? value button))
+ #:transformer (lambda (value old from)
+ (if (eq? from mouse-last-down) #t #f))
+ #:connectors (list mouse-last-down mouse-last-up)))
+
+(register-event-handler
+ 'mouse-motion
+ (lambda (e)
+ (signal-set! mouse-position
+ (vector2 (SDL:event:motion:x e)
+ (SDL:event:motion:y e)))))
+
+(register-event-handler
+ 'mouse-down
+ (lambda (e)
+ (signal-set! mouse-last-down (SDL:event:button:button e))))
+
+(register-event-handler
+ 'mouse-up
+ (lambda (e)
+ (signal-set! mouse-last-up (SDL:event:button:button e))))