Update of /cvsroot/jake2/jake2/src/jake2/sys In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv1434/src/jake2/sys Modified Files: Tag: LWJGL_IMPORT Sys.java IN.java InputListener.java KBD.java Added Files: Tag: LWJGL_IMPORT LWJGLKBD.java JOGLKBD.java Log Message: import of LWJGL code Index: InputListener.java =================================================================== RCS file: /cvsroot/jake2/jake2/src/jake2/sys/InputListener.java,v retrieving revision 1.1.1.1.2.1 retrieving revision 1.1.1.1.2.1.2.1 diff -C2 -d -r1.1.1.1.2.1 -r1.1.1.1.2.1.2.1 *** InputListener.java 6 Sep 2004 19:39:20 -0000 1.1.1.1.2.1 --- InputListener.java 13 Dec 2004 21:40:43 -0000 1.1.1.1.2.1.2.1 *************** *** 99,103 **** public void componentShown(ComponentEvent e) { ! IN.c = e.getComponent(); addEvent(new Jake2InputEvent(Jake2InputEvent.CreateNotify, e)); } --- 99,103 ---- public void componentShown(ComponentEvent e) { ! JOGLKBD.c = e.getComponent(); addEvent(new Jake2InputEvent(Jake2InputEvent.CreateNotify, e)); } --- NEW FILE: LWJGLKBD.java --- package jake2.sys; import jake2.Defines; import jake2.client.Key; import jake2.qcommon.Cbuf; import org.lwjgl.input.Keyboard; import org.lwjgl.input.Mouse; import org.lwjgl.opengl.Display; /** * @author dsanders */ public class LWJGLKBD extends KBD { static private int win_w2; static private int win_h2; public void Init() { try { if (!Keyboard.isCreated()) Keyboard.create(); if (!Mouse.isCreated()) Mouse.create(); if (!Keyboard.isBuffered()) Keyboard.enableBuffer(); if (!Mouse.isBuffered()) Mouse.enableBuffer(); win_w2=Display.getDisplayMode().getWidth()/2; win_h2=Display.getDisplayMode().getHeight()/2; } catch (Exception e) {;} } public void Update() { // get events HandleEvents(); } public void Close() { Keyboard.destroy(); Mouse.destroy(); } private void HandleEvents() { if (Display.isCloseRequested()) { Cbuf.ExecuteText(Defines.EXEC_APPEND, "quit"); } for (int i=0; i<Keyboard.getNumKeyboardEvents(); i++) { Keyboard.next(); int key=Keyboard.getEventKey(); char ch=Keyboard.getEventCharacter(); Do_Key_Event(XLateKey(key,ch),Keyboard.getEventKeyState()); } if (IN.mouse_active) { mx=(Mouse.getX()-win_w2)*2; my=(Mouse.getY()-win_h2)*2; } else { mx=0; my=0; } while (Mouse.next()) { int button=Mouse.getEventButton(); if (button>=0) { Do_Key_Event(Key.K_MOUSE1 + button, Mouse.getEventButtonState()); } } } private static int XLateKey(int code, int ch) { int key = 0; switch(code) { // 00626 case XK_KP_Page_Up: key = K_KP_PGUP; break; case Keyboard.KEY_PRIOR: key = Key.K_PGUP; break; // 00629 case XK_KP_Page_Down: key = K_KP_PGDN; break; case Keyboard.KEY_NEXT: key = Key.K_PGDN; break; // 00632 case XK_KP_Home: key = K_KP_HOME; break; case Keyboard.KEY_HOME: key = Key.K_HOME; break; // 00635 case XK_KP_End: key = K_KP_END; break; case Keyboard.KEY_END: key = Key.K_END; break; // case Keyboard.KEY_LEFT: key = Key.K_KP_LEFTARROW; break; case Keyboard.KEY_LEFT: key = Key.K_LEFTARROW; break; // case Keyboard.KEY_RIGHT: key = Key.K_KP_RIGHTARROW; break; case Keyboard.KEY_RIGHT: key = Key.K_RIGHTARROW; break; // case Keyboard.KEY_DOWN: key = Key.K_KP_DOWNARROW; break; case Keyboard.KEY_DOWN: key = Key.K_DOWNARROW; break; // case Keyboard.KEY_UP: key = Key.K_KP_UPARROW; break; case Keyboard.KEY_UP: key = Key.K_UPARROW; break; case Keyboard.KEY_ESCAPE: key = Key.K_ESCAPE; break; case Keyboard.KEY_RETURN: key = Key.K_ENTER; break; // 00652 case XK_KP_Enter: key = K_KP_ENTER; break; case Keyboard.KEY_TAB: key = Key.K_TAB; break; case Keyboard.KEY_F1: key = Key.K_F1; break; case Keyboard.KEY_F2: key = Key.K_F2; break; case Keyboard.KEY_F3: key = Key.K_F3; break; case Keyboard.KEY_F4: key = Key.K_F4; break; case Keyboard.KEY_F5: key = Key.K_F5; break; case Keyboard.KEY_F6: key = Key.K_F6; break; case Keyboard.KEY_F7: key = Key.K_F7; break; case Keyboard.KEY_F8: key = Key.K_F8; break; case Keyboard.KEY_F9: key = Key.K_F9; break; case Keyboard.KEY_F10: key = Key.K_F10; break; case Keyboard.KEY_F11: key = Key.K_F11; break; case Keyboard.KEY_F12: key = Key.K_F12; break; case Keyboard.KEY_BACK: key = Key.K_BACKSPACE; break; case Keyboard.KEY_DELETE: key = Key.K_DEL; break; // 00683 case XK_KP_Delete: key = K_KP_DEL; break; case Keyboard.KEY_PAUSE: key = Key.K_PAUSE; break; case Keyboard.KEY_RSHIFT: case Keyboard.KEY_LSHIFT: key = Key.K_SHIFT; break; case Keyboard.KEY_RCONTROL: case Keyboard.KEY_LCONTROL: key = Key.K_CTRL; break; case Keyboard.KEY_LMENU: case Keyboard.KEY_RMENU: key = Key.K_ALT; break; // 00700 case XK_KP_Begin: key = K_KP_5; break; // 00701 case Keyboard.KEY_INSERT: key = Key.K_INS; break; default: key = ch; if (key >= 'A' && key <= 'Z') key = key - 'A' + 'a'; break; } if (key > 255) key = 0; return key; } public void Do_Key_Event(int key, boolean down) { Key.Event(key, down, Sys.Milliseconds()); } public void centerMouse() { Mouse.setPosition(win_x + win_w2,win_y + win_h2); //Mouse.setGrabbed(true); //Mouse.setTrackingEnabled(true); } public void installGrabs() { Mouse.setGrabbed(true); } public void uninstallGrabs() { Mouse.setGrabbed(false); } } Index: KBD.java =================================================================== RCS file: /cvsroot/jake2/jake2/src/jake2/sys/KBD.java,v retrieving revision 1.1.1.1 retrieving revision 1.1.1.1.8.1 diff -C2 -d -r1.1.1.1 -r1.1.1.1.8.1 *** KBD.java 7 Jul 2004 19:59:51 -0000 1.1.1.1 --- KBD.java 13 Dec 2004 21:40:43 -0000 1.1.1.1.8.1 *************** *** 26,43 **** package jake2.sys; - import jake2.client.Key; - - import java.awt.*; - import java.awt.event.*; /** * KBD */ ! public final class KBD { static int win_x = 0; static int win_y = 0; - static int win_w2 = 0; - static int win_h2 = 0; // motion values --- 26,37 ---- package jake2.sys; /** * KBD */ ! abstract public class KBD { static int win_x = 0; static int win_y = 0; // motion values *************** *** 45,219 **** public static int my = 0; ! static Robot robot; ! public static InputListener listener = new InputListener(); ! ! static { ! try { ! robot = new Robot(); ! } catch (AWTException e) { ! System.exit(1); ! } ! } ! ! public static void Init() { ! } ! ! public static void Update() { ! // get events ! HandleEvents(); ! } ! ! public static void Close() { ! } ! ! static void HandleEvents() { ! int b; ! ! Jake2InputEvent event; ! while ( (event=InputListener.nextEvent()) != null ) { ! switch(event.type) { ! case Jake2InputEvent.KeyPress: ! case Jake2InputEvent.KeyRelease: ! Do_Key_Event(XLateKey((KeyEvent)event.ev), event.type == Jake2InputEvent.KeyPress); ! break; ! ! case Jake2InputEvent.MotionNotify: ! // if (IN.ignorefirst) { ! // IN.ignorefirst = false; ! // break; ! // } ! if (IN.mouse_active) { ! mx = (((MouseEvent)event.ev).getX() - win_w2) * 2; ! my = (((MouseEvent)event.ev).getY() - win_h2) * 2; ! } else { ! mx = 0; ! my = 0; ! } ! break; ! ! case Jake2InputEvent.ButtonPress: ! b=((MouseEvent)event.ev).getButton()-1; ! Do_Key_Event(Key.K_MOUSE1 + b, true); ! break; ! ! case Jake2InputEvent.ButtonRelease: ! b=((MouseEvent)event.ev).getButton()-1; ! Do_Key_Event(Key.K_MOUSE1 + b, false); ! break; ! ! case Jake2InputEvent.CreateNotify : ! case Jake2InputEvent.ConfigureNotify : ! Component c = ((ComponentEvent)event.ev).getComponent(); ! win_x = 0; ! win_y = 0; ! win_w2 = c.getWidth() / 2; ! win_h2 = c.getHeight() / 2; ! while (c != null) { ! if (c instanceof Container) { ! Insets insets = ((Container)c).getInsets(); ! win_x += insets.left; ! win_y += insets.top; ! } ! win_x += c.getX(); ! win_y += c.getY(); ! c = c.getParent(); ! } ! break; ! } ! } ! ! if (mx != 0 || my != 0) { ! // move the mouse to the window center again ! robot.mouseMove(win_x + win_w2, win_y + win_h2); ! } ! } ! ! private static int XLateKey(KeyEvent ev) { ! ! int key = 0; ! int code = ev.getKeyCode(); ! ! switch(code) { ! // 00626 case XK_KP_Page_Up: key = K_KP_PGUP; break; ! case KeyEvent.VK_PAGE_UP: key = Key.K_PGUP; break; ! ! // 00629 case XK_KP_Page_Down: key = K_KP_PGDN; break; ! case KeyEvent.VK_PAGE_DOWN: key = Key.K_PGDN; break; ! ! // 00632 case XK_KP_Home: key = K_KP_HOME; break; ! case KeyEvent.VK_HOME: key = Key.K_HOME; break; ! ! // 00635 case XK_KP_End: key = K_KP_END; break; ! case KeyEvent.VK_END: key = Key.K_END; break; ! ! case KeyEvent.VK_KP_LEFT: key = Key.K_KP_LEFTARROW; break; ! case KeyEvent.VK_LEFT: key = Key.K_LEFTARROW; break; ! ! case KeyEvent.VK_KP_RIGHT: key = Key.K_KP_RIGHTARROW; break; ! case KeyEvent.VK_RIGHT: key = Key.K_RIGHTARROW; break; ! ! case KeyEvent.VK_KP_DOWN: key = Key.K_KP_DOWNARROW; break; ! case KeyEvent.VK_DOWN: key = Key.K_DOWNARROW; break; ! ! case KeyEvent.VK_KP_UP: key = Key.K_KP_UPARROW; break; ! case KeyEvent.VK_UP: key = Key.K_UPARROW; break; ! ! case KeyEvent.VK_ESCAPE: key = Key.K_ESCAPE; break; ! ! ! case KeyEvent.VK_ENTER: key = Key.K_ENTER; break; ! // 00652 case XK_KP_Enter: key = K_KP_ENTER; break; ! ! case KeyEvent.VK_TAB: key = Key.K_TAB; break; ! ! case KeyEvent.VK_F1: key = Key.K_F1; break; ! case KeyEvent.VK_F2: key = Key.K_F2; break; ! case KeyEvent.VK_F3: key = Key.K_F3; break; ! case KeyEvent.VK_F4: key = Key.K_F4; break; ! case KeyEvent.VK_F5: key = Key.K_F5; break; ! case KeyEvent.VK_F6: key = Key.K_F6; break; ! case KeyEvent.VK_F7: key = Key.K_F7; break; ! case KeyEvent.VK_F8: key = Key.K_F8; break; ! case KeyEvent.VK_F9: key = Key.K_F9; break; ! case KeyEvent.VK_F10: key = Key.K_F10; break; ! case KeyEvent.VK_F11: key = Key.K_F11; break; ! case KeyEvent.VK_F12: key = Key.K_F12; break; ! ! case KeyEvent.VK_BACK_SPACE: key = Key.K_BACKSPACE; break; ! case KeyEvent.VK_DELETE: key = Key.K_DEL; break; ! // 00683 case XK_KP_Delete: key = K_KP_DEL; break; ! case KeyEvent.VK_PAUSE: key = Key.K_PAUSE; break; ! ! case KeyEvent.VK_SHIFT: key = Key.K_SHIFT; break; ! case KeyEvent.VK_CONTROL: key = Key.K_CTRL; break; ! ! case KeyEvent.VK_ALT: ! case KeyEvent.VK_ALT_GRAPH: key = Key.K_ALT; break; ! ! // 00700 case XK_KP_Begin: key = K_KP_5; break; ! // 00701 ! case KeyEvent.VK_INSERT: key = Key.K_INS; break; ! ! default: ! key = ev.getKeyChar(); ! if (key >= 'A' && key <= 'Z') ! key = key - 'A' + 'a'; ! break; ! } ! if (key > 255) key = 0; ! return key; ! } ! ! static void Do_Key_Event(int key, boolean down) { ! Key.Event(key, down, Sys.Milliseconds()); ! } ! ! static void centerMouse() { ! robot.mouseMove(win_x + win_w2, win_y + win_h2); ! } ! } --- 39,52 ---- public static int my = 0; ! abstract public void Init(); ! abstract public void Update(); ! abstract public void Close(); ! abstract public void Do_Key_Event(int key, boolean down); ! abstract public void installGrabs(); ! abstract public void uninstallGrabs(); ! abstract public void centerMouse(); } --- NEW FILE: JOGLKBD.java --- package jake2.sys; import jake2.client.Key; import java.awt.AWTException; import java.awt.Component; import java.awt.Container; import java.awt.Cursor; import java.awt.Insets; import java.awt.Point; import java.awt.Robot; import java.awt.event.ComponentEvent; import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import javax.swing.ImageIcon; final public class JOGLKBD extends KBD { static Robot robot; public static InputListener listener = new InputListener(); static Cursor emptyCursor = null; static Component c = null; static int win_w2 = 0; static int win_h2 = 0; static { try { robot = new Robot(); } catch (AWTException e) { System.exit(1); } } public void Init() { } public void Update() { // get events HandleEvents(); } public void Close() { } private void HandleEvents() { int b; Jake2InputEvent event; while ( (event=InputListener.nextEvent()) != null ) { switch(event.type) { case Jake2InputEvent.KeyPress: case Jake2InputEvent.KeyRelease: Do_Key_Event(XLateKey((KeyEvent)event.ev), event.type == Jake2InputEvent.KeyPress); break; case Jake2InputEvent.MotionNotify: // if (IN.ignorefirst) { // IN.ignorefirst = false; // break; // } if (IN.mouse_active) { mx = (((MouseEvent)event.ev).getX() - win_w2) * 2; my = (((MouseEvent)event.ev).getY() - win_h2) * 2; } else { mx = 0; my = 0; } break; case Jake2InputEvent.ButtonPress: b=((MouseEvent)event.ev).getButton()-1; Do_Key_Event(Key.K_MOUSE1 + b, true); break; case Jake2InputEvent.ButtonRelease: b=((MouseEvent)event.ev).getButton()-1; Do_Key_Event(Key.K_MOUSE1 + b, false); break; case Jake2InputEvent.CreateNotify : case Jake2InputEvent.ConfigureNotify : Component c = ((ComponentEvent)event.ev).getComponent(); win_x = 0; win_y = 0; win_w2 = c.getWidth() / 2; win_h2 = c.getHeight() / 2; while (c != null) { if (c instanceof Container) { Insets insets = ((Container)c).getInsets(); win_x += insets.left; win_y += insets.top; } win_x += c.getX(); win_y += c.getY(); c = c.getParent(); } break; } } if (mx != 0 || my != 0) { // move the mouse to the window center again robot.mouseMove(win_x + win_w2, win_y + win_h2); } } private static int XLateKey(KeyEvent ev) { int key = 0; int code = ev.getKeyCode(); switch(code) { // 00626 case XK_KP_Page_Up: key = K_KP_PGUP; break; case KeyEvent.VK_PAGE_UP: key = Key.K_PGUP; break; // 00629 case XK_KP_Page_Down: key = K_KP_PGDN; break; case KeyEvent.VK_PAGE_DOWN: key = Key.K_PGDN; break; // 00632 case XK_KP_Home: key = K_KP_HOME; break; case KeyEvent.VK_HOME: key = Key.K_HOME; break; // 00635 case XK_KP_End: key = K_KP_END; break; case KeyEvent.VK_END: key = Key.K_END; break; case KeyEvent.VK_KP_LEFT: key = Key.K_KP_LEFTARROW; break; case KeyEvent.VK_LEFT: key = Key.K_LEFTARROW; break; case KeyEvent.VK_KP_RIGHT: key = Key.K_KP_RIGHTARROW; break; case KeyEvent.VK_RIGHT: key = Key.K_RIGHTARROW; break; case KeyEvent.VK_KP_DOWN: key = Key.K_KP_DOWNARROW; break; case KeyEvent.VK_DOWN: key = Key.K_DOWNARROW; break; case KeyEvent.VK_KP_UP: key = Key.K_KP_UPARROW; break; case KeyEvent.VK_UP: key = Key.K_UPARROW; break; case KeyEvent.VK_ESCAPE: key = Key.K_ESCAPE; break; case KeyEvent.VK_ENTER: key = Key.K_ENTER; break; // 00652 case XK_KP_Enter: key = K_KP_ENTER; break; case KeyEvent.VK_TAB: key = Key.K_TAB; break; case KeyEvent.VK_F1: key = Key.K_F1; break; case KeyEvent.VK_F2: key = Key.K_F2; break; case KeyEvent.VK_F3: key = Key.K_F3; break; case KeyEvent.VK_F4: key = Key.K_F4; break; case KeyEvent.VK_F5: key = Key.K_F5; break; case KeyEvent.VK_F6: key = Key.K_F6; break; case KeyEvent.VK_F7: key = Key.K_F7; break; case KeyEvent.VK_F8: key = Key.K_F8; break; case KeyEvent.VK_F9: key = Key.K_F9; break; case KeyEvent.VK_F10: key = Key.K_F10; break; case KeyEvent.VK_F11: key = Key.K_F11; break; case KeyEvent.VK_F12: key = Key.K_F12; break; case KeyEvent.VK_BACK_SPACE: key = Key.K_BACKSPACE; break; case KeyEvent.VK_DELETE: key = Key.K_DEL; break; // 00683 case XK_KP_Delete: key = K_KP_DEL; break; case KeyEvent.VK_PAUSE: key = Key.K_PAUSE; break; case KeyEvent.VK_SHIFT: key = Key.K_SHIFT; break; case KeyEvent.VK_CONTROL: key = Key.K_CTRL; break; case KeyEvent.VK_ALT: case KeyEvent.VK_ALT_GRAPH: key = Key.K_ALT; break; // 00700 case XK_KP_Begin: key = K_KP_5; break; // 00701 case KeyEvent.VK_INSERT: key = Key.K_INS; break; default: key = ev.getKeyChar(); if (key >= 'A' && key <= 'Z') key = key - 'A' + 'a'; break; } if (key > 255) key = 0; return key; } public void Do_Key_Event(int key, boolean down) { Key.Event(key, down, Sys.Milliseconds()); } public void centerMouse() { robot.mouseMove(win_x + win_w2, win_y + win_h2); } public void installGrabs() { if (emptyCursor == null) { ImageIcon emptyIcon = new ImageIcon(new byte[0]); emptyCursor = c.getToolkit().createCustomCursor(emptyIcon.getImage(), new Point(0, 0), "emptyCursor"); } c.setCursor(emptyCursor); } public void uninstallGrabs() { c.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } } Index: IN.java =================================================================== RCS file: /cvsroot/jake2/jake2/src/jake2/sys/IN.java,v retrieving revision 1.2.2.2 retrieving revision 1.2.2.2.2.1 diff -C2 -d -r1.2.2.2 -r1.2.2.2.2.1 *** IN.java 8 Sep 2004 09:45:47 -0000 1.2.2.2 --- IN.java 13 Dec 2004 21:40:43 -0000 1.2.2.2.2.1 *************** *** 34,41 **** import jake2.qcommon.xcommand_t; - import java.awt.*; - - import javax.swing.ImageIcon; - /** * IN --- 34,37 ---- *************** *** 43,48 **** public final class IN extends Globals { ! static Component c = null; ! static Cursor emptyCursor = null; static boolean mouse_avail = true; --- 39,43 ---- public final class IN extends Globals { ! //static Component c = null; static boolean mouse_avail = true; *************** *** 59,63 **** public static void ActivateMouse() { ! if (!mouse_avail || c == null) return; if (!mouse_active) { KBD.mx = KBD.my = 0; // don't spazz --- 54,58 ---- public static void ActivateMouse() { ! if (!mouse_avail) return; // || c == null) return; if (!mouse_active) { KBD.mx = KBD.my = 0; // don't spazz *************** *** 76,85 **** private static void install_grabs() { ! if (emptyCursor == null) { ! ImageIcon emptyIcon = new ImageIcon(new byte[0]); ! emptyCursor = c.getToolkit().createCustomCursor(emptyIcon.getImage(), new Point(0, 0), "emptyCursor"); ! } ! c.setCursor(emptyCursor); ! KBD.centerMouse(); ignorefirst = true; --- 71,77 ---- private static void install_grabs() { ! ! Globals.re.getKeyboardHandler().installGrabs(); ! Globals.re.getKeyboardHandler().centerMouse(); ignorefirst = true; *************** *** 87,91 **** private static void uninstall_grabs() { ! c.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } --- 79,83 ---- private static void uninstall_grabs() { ! Globals.re.getKeyboardHandler().uninstallGrabs(); } *************** *** 141,150 **** return; for (i=0 ; i<3 ; i++) { if ( (IN.mouse_buttonstate & (1<<i)) != 0 && (IN.mouse_oldbuttonstate & (1<<i)) == 0 ) ! KBD.Do_Key_Event(Key.K_MOUSE1 + i, true); if ( (IN.mouse_buttonstate & (1<<i)) == 0 && (IN.mouse_oldbuttonstate & (1<<i)) != 0 ) ! KBD.Do_Key_Event(Key.K_MOUSE1 + i, false); } IN.mouse_oldbuttonstate = IN.mouse_buttonstate; --- 133,143 ---- return; + KBD kbd=Globals.re.getKeyboardHandler(); for (i=0 ; i<3 ; i++) { if ( (IN.mouse_buttonstate & (1<<i)) != 0 && (IN.mouse_oldbuttonstate & (1<<i)) == 0 ) ! kbd.Do_Key_Event(Key.K_MOUSE1 + i, true); if ( (IN.mouse_buttonstate & (1<<i)) == 0 && (IN.mouse_oldbuttonstate & (1<<i)) != 0 ) ! kbd.Do_Key_Event(Key.K_MOUSE1 + i, false); } IN.mouse_oldbuttonstate = IN.mouse_buttonstate; *************** *** 166,170 **** if (!IN.mouse_avail) return; ! if (Globals.m_filter.value != 0.0f) { KBD.mx = (KBD.mx + IN.old_mouse_x) / 2; --- 159,164 ---- if (!IN.mouse_avail) return; ! ! KBD kbd=Globals.re.getKeyboardHandler(); if (Globals.m_filter.value != 0.0f) { KBD.mx = (KBD.mx + IN.old_mouse_x) / 2; Index: Sys.java =================================================================== RCS file: /cvsroot/jake2/jake2/src/jake2/sys/Sys.java,v retrieving revision 1.3.2.2 retrieving revision 1.3.2.2.2.1 diff -C2 -d -r1.3.2.2 -r1.3.2.2.2.1 *** Sys.java 6 Sep 2004 19:39:20 -0000 1.3.2.2 --- Sys.java 13 Dec 2004 21:40:43 -0000 1.3.2.2.2.1 *************** *** 228,232 **** public static void SendKeyEvents() { ! KBD.Update(); // grab frame time --- 228,232 ---- public static void SendKeyEvents() { ! Globals.re.getKeyboardHandler().Update(); // grab frame time |