KeyDown(KEY_ESCAPE) Fails

BlitzMax Forums/BlitzMax Programming/KeyDown(KEY_ESCAPE) Fails

Nigel Brown(Posted 2006) [#1]
Using polled input under Linux KeyDown(KEY_ESCAPE) dose'nt work at all.

other keys seem to stick after being held down and stop working also?

Const WINDOW_WIDTH=640
Const WINDOW_HEIGHT=384

Local wx=(GadgetWidth(Desktop())-WINDOW_WIDTH)/2
Local wy=(GadgetHeight(Desktop())-WINDOW_HEIGHT)/2
Global main_window:TGadget = CreateWindow( Title$,wx,wy,WINDOW_WIDTH,WINDOW_HEIGHT,Null,WINDOW_TITLEBAR | WINDOW_CLIENTCOORDS)
Global canvas:TGadget=CreateCanvas(0,0,WINDOW_WIDTH,WINDOW_HEIGHT,main_window)
SetGraphics CanvasGraphics(canvas)

ActivateGadget canvas

CreateTimer(10)

enablepolledinput()

While WaitEvent()

	Select	EventID()

		Case EVENT_WINDOWCLOSE
			End

		Case EVENT_TIMERTICK

			If KeyDown(KEY_LEFT)
				SetClsColor Rnd(255),Rnd(255),Rnd(255)
				Cls
				Flip
			EndIf

	EndSelect

End While



BlitzSupport(Posted 2006) [#2]
.


Nigel Brown(Posted 2006) [#3]
James, thanks for the reply. Not what I wanted to hear! Windows and Mac versions of the code work perfectly but Linux is again different?

Here is the modified code that gives suprise results. Hold a key down and watch the debug output. Where are the EVENT_KEYUP's coming from?

Const WINDOW_WIDTH=640
Const WINDOW_HEIGHT=384

Global hit[1024]

Function MyKeyDown( key:Int )
	Return HIT[Key]
End Function

Local wx=(GadgetWidth(Desktop())-WINDOW_WIDTH)/2
Local wy=(GadgetHeight(Desktop())-WINDOW_HEIGHT)/2
Global main_window:TGadget = CreateWindow( Title$,wx,wy,WINDOW_WIDTH,WINDOW_HEIGHT,Null,WINDOW_TITLEBAR | WINDOW_CLIENTCOORDS)
Global canvas:TGadget=CreateCanvas(0,0,WINDOW_WIDTH,WINDOW_HEIGHT,main_window)
SetGraphics CanvasGraphics(canvas)

ActivateGadget canvas

CreateTimer(10)

'enablepolledinput()

While WaitEvent()

	Select	EventID()

		Case EVENT_WINDOWCLOSE
			End

		Case EVENT_KEYUP
			DebugLog "KEY UP"
			Select EventData()
				Case KEY_LEFT
					HIT[KEY_LEFT]=0
			End Select
			
		Case EVENT_KEYDOWN
			DebugLog "KEY DOWN"
			Select EventData()
				Case KEY_LEFT
					HIT[KEY_LEFT]=1
			End Select

		Case EVENT_TIMERTICK

			If MyKeyDown(KEY_LEFT)
				SetClsColor Rnd(255),Rnd(255),Rnd(255)
				Cls
				Flip
			EndIf

	EndSelect

End While



BlitzSupport(Posted 2006) [#4]
.


Nigel Brown(Posted 2006) [#5]
PLEASE! PLEASE! PLEASE! Someone READ! my posts and PLEASE! TRY! the source under ***LINUX***.

> In your example, holding a key down prints "KEY DOWN" and nothing happens until I release, which prints "KEY UP". Are you getting something different?

YES, if I were getting what you had described there would be no problem. The EVENT_KEYUPs I am seeing are not coming from a KEY being released because I am holding the key down. I still see EVENT_KEYUP when a key is being held down?

PLEASE tell me where I can find the LINUX keyboard reading code and I will attempt to fix it myself.

I don't believe that my english is this poor. And yes I am feeling very perturbed about the lack of support.


skidracer(Posted 2006) [#6]
Since 1.03 or something you should be getting one keydown, a whole bunch of keyrepeat's and a keyup message, are you on ubuntu gnome or something else? This may also be something that is broken in fltk, sorry I can't test right now.

To help debug try adding a
debuglog currentevent.tostring()

just after waitevent()


Nigel Brown(Posted 2006) [#7]
Skid,

I am using SuSE 10.1.


Nigel Brown(Posted 2006) [#8]
The debug data I get back when holding the "up arrow" down and on a single press is.

KeyUp: data=38, mods=0, x=417, y=-3, extra =""


skidracer(Posted 2006) [#9]
and gtk or kde?

if you want to try something add

		case FL_KEYDOWN:
		case FL_UP:

at line 620 of fltkmaxgui.mod/fltkglue.cpp which might stop it eating arrow keys and the escape key due to it maybe thinking you are wanting to navigate between gadgets or something, it's just a guess but build modules and see...

also a dump of the events you do get would be interesting, try other keys besides arrows and escape, you may get better results...


Nigel Brown(Posted 2006) [#10]
1. Added case statements to fltkglue but made no change.

2. SHIFT, CTRL, ALT, BREAK... produce keydown only.

3. ESC produces nothing at all.

4. brl.fltkmaxgui produdes keyup events when holding key down.

5 bah.gtkmaxgui produces keydown events when holding keys down.


skidracer(Posted 2006) [#11]
oops that shoul be fl_keyup not fl_up above


Nigel Brown(Posted 2006) [#12]
6. If I add EVENT_KEYREPEAT to the equasion. Windows reports them correctly. Linux fails to get any repeats but seems to express them as keyup events instead. Unless using GTK it expresses them as keydown events.


Nigel Brown(Posted 2006) [#13]
in system.linux.c @ line 91

if ( xeventhandler ){
ifxeventhandler(xevent))return;
}

swallows all the Esc key presses not allowing any to fall through into the switch statement.


skidracer(Posted 2006) [#14]
Sorry one more guess, will be getting my linux box back tomorrow hopefully, try at fltkmaxgui.mod/fltkglue.cpp[620]:

		case FL_SHORTCUT:
		case FL_KEYDOWN:
		case FL_KEYUP:


which should have the fltk canvas ignore all shortcuts keys of which Escape is unfortunately one.


Nigel Brown(Posted 2006) [#15]
Just tried the above code change. No key presses at all with those mods applied.

Did notice that the escape key does generate a KEYUP event but no KEYDOWN


plash(Posted 2006) [#16]
Sounds like we've got ourselves a bug!


Wellmt(Posted 2006) [#17]
Using Nigels code above, If I press and hold a key all I get are KEY UP Messages. I have to actually press on a key to get a KEY DOWN message.

I know it's late but I wanted to confirm that it doesn't work properly under Ubuntu either.


Brucey(Posted 2006) [#18]
Skid,

what events am I meant to be raising when someone holds down a key?
A single keydown followed by a list of key repeats ?

If that's the case I guess the gtk mod needs fixing.


Nigel Brown(Posted 2006) [#19]
Brucey,

EVENT_KEYREPEAT would seem the most usefull to be generated by a key being held down? GTK seems to return the opposite to FLTK ie it repeats EVENT_KEYUP for a hold.


skidracer(Posted 2006) [#20]
Brucey, FLTK is not quite up with the play either regarding this. Will have a play this weekend.


Brucey(Posted 2006) [#21]
Yay... latest GTK mod now does the following :

EVENT_KEYDOWN
EVENT_KEYREPEAT ... (repeating)
EVENT_KEYUP

..amongst other fixes (see HERE for more details.)


Nigel Brown(Posted 2006) [#22]
GTK working well now thank's Brucey!