From 55c854fc3016b4a3e9328c7c97495d5f3d770e28 Mon Sep 17 00:00:00 2001 From: David Thompson Date: Fri, 10 Nov 2017 21:23:58 -0500 Subject: Add mouse input module. * sdl2/input/mouse.scm: New file. * Makefile.am (SOURCES): Add it. --- Makefile.am | 1 + sdl2/input/mouse.scm | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+) create mode 100644 sdl2/input/mouse.scm diff --git a/Makefile.am b/Makefile.am index 7325bee..1d504f5 100644 --- a/Makefile.am +++ b/Makefile.am @@ -52,6 +52,7 @@ SOURCES = \ sdl2/input/keyboard.scm \ sdl2/input/joystick.scm \ sdl2/input/game-controller.scm \ + sdl2/input/mouse.scm \ sdl2/input/text.scm if WITH_LIBSDL2_IMAGE diff --git a/sdl2/input/mouse.scm b/sdl2/input/mouse.scm new file mode 100644 index 0000000..55c7833 --- /dev/null +++ b/sdl2/input/mouse.scm @@ -0,0 +1,67 @@ +;;; guile-sdl2 --- FFI bindings for SDL2 +;;; Copyright © 2017 David Thompson +;;; +;;; This file is part of guile-sdl2. +;;; +;;; Guile-sdl2 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-sdl2 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 Lesser General Public +;;; License along with guile-sdl2. If not, see +;;; . + +;;; Commentary: +;; +;; Mouse input. +;; +;;; Code: + +(define-module (sdl2 input mouse) + #:use-module (ice-9 match) + #:use-module (rnrs bytevectors) + #:use-module (sdl2) + #:use-module ((sdl2 bindings) #:prefix ffi:) + #:use-module (system foreign) + #:export (mouse-x + mouse-y + mouse-button-pressed?)) + +(define (make-int) + (make-bytevector (sizeof int))) + +(define (get-int bv) + (bytevector-sint-ref bv 0 (native-endianness) (sizeof int))) + +(define mouse-x + (let* ((bv (make-int)) + (ptr (bytevector->pointer bv))) + (lambda () + "Return the x coordinate of the mouse cursor." + (ffi:sdl-get-mouse-state ptr %null-pointer) + (get-int bv)))) + +(define mouse-y + (let* ((bv (make-int)) + (ptr (bytevector->pointer bv))) + (lambda () + "Return the y coordinate of the mouse cursor." + (ffi:sdl-get-mouse-state %null-pointer ptr) + (get-int bv)))) + +(define (mouse-button-pressed? button) + "Return #t if BUTTON is currently being pressed." + (let ((mask (match button + ('left ffi:SDL_BUTTON_LMASK) + ('middle ffi:SDL_BUTTON_MMASK) + ('right ffi:SDL_BUTTON_RMASK) + ('x1 ffi:SDL_BUTTON_X1MASK) + ('x2 ffi:SDL_BUTTON_X2MASK))) + (buttons (ffi:sdl-get-mouse-state %null-pointer %null-pointer))) + (> (logand mask buttons) 0))) -- cgit v1.2.3