121f1a70e6cecd48ff6ae8dd23d59d80bb30bbe73Jon Renner/*******************************************************************************
221f1a70e6cecd48ff6ae8dd23d59d80bb30bbe73Jon Renner * Copyright 2011 See AUTHORS file.
321f1a70e6cecd48ff6ae8dd23d59d80bb30bbe73Jon Renner *
421f1a70e6cecd48ff6ae8dd23d59d80bb30bbe73Jon Renner * Licensed under the Apache License, Version 2.0 (the "License");
521f1a70e6cecd48ff6ae8dd23d59d80bb30bbe73Jon Renner * you may not use this file except in compliance with the License.
621f1a70e6cecd48ff6ae8dd23d59d80bb30bbe73Jon Renner * You may obtain a copy of the License at
721f1a70e6cecd48ff6ae8dd23d59d80bb30bbe73Jon Renner *
821f1a70e6cecd48ff6ae8dd23d59d80bb30bbe73Jon Renner *   http://www.apache.org/licenses/LICENSE-2.0
921f1a70e6cecd48ff6ae8dd23d59d80bb30bbe73Jon Renner *
1021f1a70e6cecd48ff6ae8dd23d59d80bb30bbe73Jon Renner * Unless required by applicable law or agreed to in writing, software
1121f1a70e6cecd48ff6ae8dd23d59d80bb30bbe73Jon Renner * distributed under the License is distributed on an "AS IS" BASIS,
1221f1a70e6cecd48ff6ae8dd23d59d80bb30bbe73Jon Renner * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1321f1a70e6cecd48ff6ae8dd23d59d80bb30bbe73Jon Renner * See the License for the specific language governing permissions and
1421f1a70e6cecd48ff6ae8dd23d59d80bb30bbe73Jon Renner * limitations under the License.
15b97b34a82af276a09bec2885854dc391ec65023dNathanSweet ******************************************************************************/
16b97b34a82af276a09bec2885854dc391ec65023dNathanSweet
17b97b34a82af276a09bec2885854dc391ec65023dNathanSweetpackage com.badlogic.gdx;
18b97b34a82af276a09bec2885854dc391ec65023dNathanSweet
19b97b34a82af276a09bec2885854dc391ec65023dNathanSweetimport com.badlogic.gdx.utils.IntArray;
20b97b34a82af276a09bec2885854dc391ec65023dNathanSweetimport com.badlogic.gdx.utils.TimeUtils;
21b97b34a82af276a09bec2885854dc391ec65023dNathanSweet
22b97b34a82af276a09bec2885854dc391ec65023dNathanSweet/** Queues events that are later passed to the wrapped {@link InputProcessor}.
23b97b34a82af276a09bec2885854dc391ec65023dNathanSweet * @author Nathan Sweet */
24522c28e0c2ace47bde479538b955d947b4f7eaf7badlogicpublic class InputEventQueue implements InputProcessor {
25b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	static private final int KEY_DOWN = 0;
26b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	static private final int KEY_UP = 1;
27b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	static private final int KEY_TYPED = 2;
28b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	static private final int TOUCH_DOWN = 3;
29b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	static private final int TOUCH_UP = 4;
30b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	static private final int TOUCH_DRAGGED = 5;
31b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	static private final int MOUSE_MOVED = 6;
32b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	static private final int SCROLLED = 7;
33b97b34a82af276a09bec2885854dc391ec65023dNathanSweet
34b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	private InputProcessor processor;
35b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	private final IntArray queue = new IntArray();
36b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	private final IntArray processingQueue = new IntArray();
37b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	private long currentEventTime;
38b97b34a82af276a09bec2885854dc391ec65023dNathanSweet
39522c28e0c2ace47bde479538b955d947b4f7eaf7badlogic	public InputEventQueue () {
40b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	}
41b97b34a82af276a09bec2885854dc391ec65023dNathanSweet
42522c28e0c2ace47bde479538b955d947b4f7eaf7badlogic	public InputEventQueue (InputProcessor processor) {
43b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		this.processor = processor;
44b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	}
45b97b34a82af276a09bec2885854dc391ec65023dNathanSweet
46b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	public void setProcessor (InputProcessor processor) {
47b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		this.processor = processor;
48b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	}
49b97b34a82af276a09bec2885854dc391ec65023dNathanSweet
50b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	public InputProcessor getProcessor () {
51b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		return processor;
52b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	}
53b97b34a82af276a09bec2885854dc391ec65023dNathanSweet
54b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	public void drain () {
55b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		IntArray q = processingQueue;
56b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		synchronized (this) {
57b97b34a82af276a09bec2885854dc391ec65023dNathanSweet			if (processor == null) {
58b97b34a82af276a09bec2885854dc391ec65023dNathanSweet				queue.clear();
59b97b34a82af276a09bec2885854dc391ec65023dNathanSweet				return;
60b97b34a82af276a09bec2885854dc391ec65023dNathanSweet			}
61b97b34a82af276a09bec2885854dc391ec65023dNathanSweet			q.addAll(queue);
62b97b34a82af276a09bec2885854dc391ec65023dNathanSweet			queue.clear();
63b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		}
64beb86317d162cc891a19cc4b307775b5a24f357ebadlogic		InputProcessor localProcessor = processor;
65b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		for (int i = 0, n = q.size; i < n;) {
66b97b34a82af276a09bec2885854dc391ec65023dNathanSweet			currentEventTime = (long)q.get(i++) << 32 | q.get(i++) & 0xFFFFFFFFL;
67b97b34a82af276a09bec2885854dc391ec65023dNathanSweet			switch (q.get(i++)) {
68b97b34a82af276a09bec2885854dc391ec65023dNathanSweet			case KEY_DOWN:
69beb86317d162cc891a19cc4b307775b5a24f357ebadlogic				localProcessor.keyDown(q.get(i++));
70b97b34a82af276a09bec2885854dc391ec65023dNathanSweet				break;
71b97b34a82af276a09bec2885854dc391ec65023dNathanSweet			case KEY_UP:
72beb86317d162cc891a19cc4b307775b5a24f357ebadlogic				localProcessor.keyUp(q.get(i++));
73b97b34a82af276a09bec2885854dc391ec65023dNathanSweet				break;
74b97b34a82af276a09bec2885854dc391ec65023dNathanSweet			case KEY_TYPED:
75beb86317d162cc891a19cc4b307775b5a24f357ebadlogic				localProcessor.keyTyped((char)q.get(i++));
76b97b34a82af276a09bec2885854dc391ec65023dNathanSweet				break;
77b97b34a82af276a09bec2885854dc391ec65023dNathanSweet			case TOUCH_DOWN:
78beb86317d162cc891a19cc4b307775b5a24f357ebadlogic				localProcessor.touchDown(q.get(i++), q.get(i++), q.get(i++), q.get(i++));
79b97b34a82af276a09bec2885854dc391ec65023dNathanSweet				break;
80b97b34a82af276a09bec2885854dc391ec65023dNathanSweet			case TOUCH_UP:
81beb86317d162cc891a19cc4b307775b5a24f357ebadlogic				localProcessor.touchUp(q.get(i++), q.get(i++), q.get(i++), q.get(i++));
82b97b34a82af276a09bec2885854dc391ec65023dNathanSweet				break;
83b97b34a82af276a09bec2885854dc391ec65023dNathanSweet			case TOUCH_DRAGGED:
84beb86317d162cc891a19cc4b307775b5a24f357ebadlogic				localProcessor.touchDragged(q.get(i++), q.get(i++), q.get(i++));
85b97b34a82af276a09bec2885854dc391ec65023dNathanSweet				break;
86b97b34a82af276a09bec2885854dc391ec65023dNathanSweet			case MOUSE_MOVED:
87beb86317d162cc891a19cc4b307775b5a24f357ebadlogic				localProcessor.mouseMoved(q.get(i++), q.get(i++));
88b97b34a82af276a09bec2885854dc391ec65023dNathanSweet				break;
89b97b34a82af276a09bec2885854dc391ec65023dNathanSweet			case SCROLLED:
90beb86317d162cc891a19cc4b307775b5a24f357ebadlogic				localProcessor.scrolled(q.get(i++));
91b97b34a82af276a09bec2885854dc391ec65023dNathanSweet				break;
92b97b34a82af276a09bec2885854dc391ec65023dNathanSweet			}
93b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		}
94b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		q.clear();
95b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	}
96b97b34a82af276a09bec2885854dc391ec65023dNathanSweet
97b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	private void queueTime () {
98b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		long time = TimeUtils.nanoTime();
99b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queue.add((int)(time >> 32));
100b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queue.add((int)time);
101b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	}
102b97b34a82af276a09bec2885854dc391ec65023dNathanSweet
103b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	public synchronized boolean keyDown (int keycode) {
104b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queueTime();
105b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queue.add(KEY_DOWN);
106b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queue.add(keycode);
107b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		return false;
108b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	}
109b97b34a82af276a09bec2885854dc391ec65023dNathanSweet
110b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	public synchronized boolean keyUp (int keycode) {
111b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queueTime();
112b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queue.add(KEY_UP);
113b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queue.add(keycode);
114b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		return false;
115b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	}
116b97b34a82af276a09bec2885854dc391ec65023dNathanSweet
117b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	public synchronized boolean keyTyped (char character) {
118b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queueTime();
119b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queue.add(KEY_TYPED);
120b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queue.add(character);
121b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		return false;
122b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	}
123b97b34a82af276a09bec2885854dc391ec65023dNathanSweet
124b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	public synchronized boolean touchDown (int screenX, int screenY, int pointer, int button) {
125b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queueTime();
126b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queue.add(TOUCH_DOWN);
127b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queue.add(screenX);
128b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queue.add(screenY);
129b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queue.add(pointer);
130b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queue.add(button);
131b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		return false;
132b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	}
133b97b34a82af276a09bec2885854dc391ec65023dNathanSweet
134b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	public synchronized boolean touchUp (int screenX, int screenY, int pointer, int button) {
135b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queueTime();
136b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queue.add(TOUCH_UP);
137b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queue.add(screenX);
138b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queue.add(screenY);
139b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queue.add(pointer);
140b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queue.add(button);
141b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		return false;
142b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	}
143b97b34a82af276a09bec2885854dc391ec65023dNathanSweet
144b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	public synchronized boolean touchDragged (int screenX, int screenY, int pointer) {
145b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queueTime();
146b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queue.add(TOUCH_DRAGGED);
147b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queue.add(screenX);
148b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queue.add(screenY);
149b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queue.add(pointer);
150b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		return false;
151b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	}
152b97b34a82af276a09bec2885854dc391ec65023dNathanSweet
153b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	public synchronized boolean mouseMoved (int screenX, int screenY) {
154b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queueTime();
155b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queue.add(MOUSE_MOVED);
156b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queue.add(screenX);
157b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queue.add(screenY);
158b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		return false;
159b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	}
160b97b34a82af276a09bec2885854dc391ec65023dNathanSweet
161b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	public synchronized boolean scrolled (int amount) {
162b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queueTime();
163b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queue.add(SCROLLED);
164b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		queue.add(amount);
165b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		return false;
166b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	}
167b97b34a82af276a09bec2885854dc391ec65023dNathanSweet
168b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	public long getCurrentEventTime () {
169b97b34a82af276a09bec2885854dc391ec65023dNathanSweet		return currentEventTime;
170b97b34a82af276a09bec2885854dc391ec65023dNathanSweet	}
171b97b34a82af276a09bec2885854dc391ec65023dNathanSweet}
172