Skip to content

Instantly share code, notes, and snippets.

@jvillste
Created September 21, 2011 21:05
Show Gist options
  • Save jvillste/1233319 to your computer and use it in GitHub Desktop.
Save jvillste/1233319 to your computer and use it in GitHub Desktop.
(defn- handle-input [input state-changes event]
(-> input
(assoc :past-states (conj (:past-states input)
(:current-state input)))
(assoc :current-state (apply assoc input-state
(concat state-changes
[:last-event event
:time (System/nanoTime)])))))
(defn handle-mouse-button-press [input lwjgl-event]
(case [(:mouse-button lwjgl-event) (:mouse-button-state lwjgl-event)]
[0 true] (handle-input input
[:left-mouse-button-down true]
{:type :left-mouse-button-down})
[1 true] (handle-input input
[:right-mouse-button-down true]
{:type :right-mouse-button-down})
[2 true] (handle-input input
[:middle-mouse-button-down true]
{:type :middle-mouse-button-down})
[0 false] (handle-input input
[:left-mouse-button-down false]
{:type :left-mouse-button-up})
[1 false] (handle-input input
[:right-mouse-button-down false]
{:type :right-mouse-button-up})
[2 false] (handle-input input
[:middle-mouse-button-down false]
{:type :middle-mouse-button-up})
input))
(defn get-lwjgl-mouse-event []
(let [event {
:mouse-button-down (Mouse/getEventButton)
:mouse-button-state (Mouse/getEventButtonState)
:mouse-wheel-delta (Mouse/getEventDWheel)
:mouse-x (Mouse/getEventX)
:mouse-y (Mouse/getEventY)
:mouse-delta-x (Mouse/getEventDX)
:mouse-delta-y (Mouse/getEventDY)
}]
(assoc event :type (cond (or (> (:mouse-delta-x event) 0)
(> (:mouse-delta-y event) 0)) :mouse-move
(not (= 0 (:mouse-wheel-delta event))) :mouse-wheel
(not (= :mouse-button -1) :mouse-button)))))
(defn handle-mouse-move [input lwjgl-event]
(handle-input input
[:mouse-x (Mouse/getEventX) :mouse-y (Mouse/getEventY)
:mouse-dx (Mouse/getEventDX) :mouse-dy (Mouse/getEventDY)]
{:type :mouse-moved}))
(defn handle-mouse-wheel [input lwjgl-event]
(handle-input input
[:mouse-wheel-delta (:mouse-wheel-delta lwjgl-event)]
{:type :mouse-wheel-moved})
input)
(defn read-input [input]
(loop [new-input input]
(if (Mouse/next)
(recur (let [lwjgl-event (get-lwjgl-event)]
(case (:type lwjgl-event)
:mouse-button (handle-mouse-button-press input lwjgl-event)
:mouse-move (handle-mouse-move input lwjgl-event)
:mouse-wheel (handle-mouse-wheel input lwjgl-event))
new-input))
new-input))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment