LINUX.ORG.RU

[gtk] Как отследить удержание клавиши?

 


0

0

При нажатии и удерживании клавиши на клавиатуре gtk получает последовательно сигналы press - release, т.е. key-release-event в действительности - полная лажа и совершенно никакой полезной информации не несет.

Как можно узнать, что пользователь реально отпустил клавишу?

☆☆☆☆☆

Сделал через задницу:

gboolean reset_accel(){
	key_acceleration = 1.;
	return FALSE;
}
gboolean release_ogl_key(Window *window, GdkEventKey * event){
	if(!window || !event) return FALSE;
	static gint tag = 0;
	if(tag) gtk_timeout_remove(tag);
	tag = gtk_timeout_add(100, reset_accel, NULL);
	return FALSE;
}

Eddy_Em ☆☆☆☆☆
() автор топика

Как можно узнать, что пользователь реально отпустил клавишу?

А почему Key Release не то? И какую информацию о должен нести.

P.S. Первая мысль была: при событии press запускать таймер, как только произошёл release(т.е пользователь отпустил клавишу) смотреть интервал, если больше N-милисекунд(секунд), значит пользователь удерживал клавишу и соответственно делаем то что надо.

xterro ★★★★★
()

> При нажатии и удерживании клавиши на клавиатуре gtk получает последовательно сигналы press - release,

AFAIR, так работают X-ы. Сам gtk тут ни при чем.

anonymous
()
Ответ на: комментарий от xterro

Я при удержании клавиши увеличиваю счетчик key_acceleration для удобной «навигации» вокруг 3D-изображения. Как только клавиша отпускается, счетчик сбрасывается. В принципе, учитывая то, что никакой смысловой нагрузки событие key-release не несет, можно таймер засунуть и в обработчик key-press.

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от xterro

> при событии press запускать таймер, как только произошёл release(т.е пользователь отпустил клавишу) смотреть интервал, если больше N-милисекунд(секунд), значит пользователь удерживал клавишу и соответственно делаем то что надо.

таймер уже есть в XKeyEvent, можно выдергивать оттуда поле time.

проблема в том, что при удержании клавиши, если это не модификатор, собыкое KeyPress будет генерироваться повторно (см. выхлоп xev с соответствующими событиями). но это решается тривиальным мьютексом

ananas ★★★★★
()
Ответ на: комментарий от ananas

таймер уже есть в XKeyEvent, можно выдергивать оттуда поле time

И чем это мне поможет?

но это решается тривиальным мьютексом

Зачем усложнять?

Eddy_Em ☆☆☆☆☆
() автор топика
Ответ на: комментарий от ananas

проблема в том, что при удержании клавиши, если это не модификатор, собыкое KeyPress будет генерироваться повторно (см. выхлоп xev с соответствующими событиями). но это решается тривиальным мьютексом

это можно решить присмотревшись к значению serial. При генерации пар KeyPress-KeyRelease по таймауту при зажатой кнопке serial ОДИНАКОВ. То есть при нажатии кнопки приходит событие с serial скажем 50, потом истекает таймаут и приходят два сообщения (KeyRelase,KeyPress) с одним и тем-же номером 51, потом кнопка отпускается и приходит KeyRelease с serial 52.

MKuznetsov ★★★★★
()
Ответ на: комментарий от MKuznetsov

> это можно решить присмотревшись к значению serial

не самый надежный способ. во-всяком случае судя по поведению xev

ananas ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.