bh@sgi.com (Bent Hagemark) (10/25/89)
Can anyone give me pointers (!) on how to make NeWS respond to arrow key events by moving the mouse pointer? I did something similar with X by writing a program based on XGrabKey and XWarpPointer (hitting uparrow moved the input focus to the window above). Didn't interfere with a concurrently running uwm if you really did want move your hand over to the mouse, move it, aim it, and move your hand back to the keyboard. :-) Bent bh@sgi.com
don@CS.UMD.EDU (Don Hopkins) (10/26/89)
Date: 25 Oct 89 16:56:52 GMT From: sgi!shinobu!odin!sgi.com!bh@ucbvax.Berkeley.EDU (Bent Hagemark) Subject: moving the mouse with arrow keys To: news-makers@brillig.umd.edu Can anyone give me pointers (!) on how to make NeWS respond to arrow key events by moving the mouse pointer? I did something similar with X by writing a program based on XGrabKey and XWarpPointer (hitting uparrow moved the input focus to the window above). Didn't interfere with a concurrently running uwm if you really did want move your hand over to the mouse, move it, aim it, and move your hand back to the keyboard. :-) Bent bh@sgi.com Here's a program I wrote to do what you describe on a Sun keyboard, under NeWS 1.1. You may have to change the key names if you have a different kind of keyboard. I haven't tested it under X11/NeWS, but the principle is probably the same. I think you'd have to detect the shift keys differently (my guess is that you could sending a message to ClassKeyboard to look up the symbols of the key codes in the event's KeyState array, before the case statement). Does anybody know the "official" way to detect shift keys in X11/NeWS? Things to do: Make the cursor keys autorepeat. Cursor position stack for flipping between windows from the keyboard (push current position, next position, last position, pop position). Make the cursor position stack record mouse positions relative to the canvas under the cursor (or the input focus canvas), so the right thing happens even after you move windows around. Automatically bring the canvas (or its enclosing frame) to the top when you warp the cursor into it. On the fly journal macros (like emacs keyboard macros, that replay relative mouse motion, clicks, and keystrokes) ... Who knows if it would be useful, but it would be easy enough to try! -Don %! % Simulate mouse movement and clicks, with shifted keypad arrows % % Don Hopkins, University of Maryland Human Computer Interaction Lab % % Copyright (C) 1988 by Don Hopkins. All rights reserved. % This program is provided for unrestricted use, provided that this % copyright message is preserved. There is no warranty, and no author % or distributer accepts responsibility for any damage caused by this % program. % % Fake mouse movement: % % Control: small step (1 point) % Shift: medium step (16 points) % Meta: big step (100 points) % % R7 R8 R9 % R10 R12 % R13 R14 R15 % % Fake mouse clicks: % % Control-R11: Left mouse click % Shift-R11: Middle mouse click % Meta-R11: Right mouse click % % Unshifted function keys are just send through. % systemdict begin % Later: % Express interest in function key UpTransitions some how, leave % the Action field alone, and just send one event... /fake-button { % event name => event 1 index createevent copy % event name event begin % event name /Name exch def % event currentdict end % event FakeDownEvent dup createevent copy % event FakeDownEvent FakeDownEvent sendevent % event FakeDownEvent begin % event /Action /UpTransition def currentdict end % event FakeUpEvent sendevent % event } def /push-button { true 1 index /KeyState get { { /Control { pop /LeftMouseButton fake-button false exit } /Shift { pop /MiddleMouseButton fake-button false exit } /Meta { pop /RightMouseButton fake-button false exit } } case } forall { redistributeevent } if } def /move-mouse { % event dx dy => event gsave framebuffer setcanvas 2 index begin /Name /MouseDragged def YLocation add /YLocation exch def XLocation add /XLocation exch def XLocation YLocation setcursorlocation currentdict end sendevent grestore } def /mouse-small-step 1 def /mouse-medium-step 16 def /mouse-big-step 100 def /push-mouse { % event x y => event true 3 index /KeyState get { { /Control { pop mouse-small-step mul exch mouse-small-step mul exch move-mouse false exit } /Shift { pop mouse-medium-step mul exch mouse-medium-step mul exch move-mouse false exit } /Meta { pop mouse-big-step mul exch mouse-big-step mul exch move-mouse false exit } } case } forall { pop pop redistributeevent } if } def /FunctionR7 { -1 1 push-mouse } bindkey /FunctionR8 { 0 1 push-mouse } bindkey /FunctionR9 { 1 1 push-mouse } bindkey /FunctionR10 { -1 0 push-mouse } bindkey /FunctionR12 { 1 0 push-mouse } bindkey /FunctionR13 { -1 -1 push-mouse } bindkey /FunctionR14 { 0 -1 push-mouse } bindkey /FunctionR15 { 1 -1 push-mouse } bindkey /FunctionR11 { push-button } bindkey end % systemdict