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