Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 12.04.2017, 09:15   #1
GoldSieg
Пользователь
 
Регистрация: 02.10.2011
Сообщений: 45
По умолчанию Действие по комбинации нажатия клавиш

Доброго времени суток.
что то никак не могу понять как лучше реализовать.
Требуется что бы совершалось действие по вводу "кода" т.е нажимаешь подряд 5,4,6 и хоп что то происходит.

Сейчас общение с клавиатурой настроено следующий образом
Код:
    KeySym keysym = XLookupKeysym( keyevent, 0 );

    if( keyevent->type == KeyPress )
    {
        switch( keysym )
        {
            case XK_F10:
                SetTimeShiftMode = !SetTimeShiftMode;
                if( SetTimeShiftMode == false )
                    save_time_shift();
                break;

            case XK_Return:
                break;

            case XK_Tab:
                if( cross = !cross )
		{Map.cross_show();
		std::cout << "СОБЫТИЕ" << std::endl;}

                else
                    Map.cross_hide();
                break;

            case XK_plus:
            case XK_equal:
            case XK_KP_Add:

........
Как все так реализовать чтобы работало адекватно?
GoldSieg вне форума Ответить с цитированием
Старый 12.04.2017, 09:36   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Возможный подход - копим все события в круговой буфер нужной длинны и проверяем на содержание в буфере нужной комбинации.
А правильный подход - читаем https://en.wikipedia.org/wiki/Finite-state_machine
waleri вне форума Ответить с цитированием
Старый 12.04.2017, 10:16   #3
GoldSieg
Пользователь
 
Регистрация: 02.10.2011
Сообщений: 45
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Возможный подход - копим все события в круговой буфер нужной длинны и проверяем на содержание в буфере нужной комбинации.
А правильный подход - читаем https://en.wikipedia.org/wiki/Finite-state_machine
Что то очень сложно
GoldSieg вне форума Ответить с цитированием
Старый 12.04.2017, 10:36   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,708
По умолчанию

Ничего сложного. В лоб: состояния - ждем, получили 1 нужный символ, получили 2 нужный символ, получили все. Переходы простейшие...
p51x вне форума Ответить с цитированием
Старый 12.04.2017, 10:46   #5
GoldSieg
Пользователь
 
Регистрация: 02.10.2011
Сообщений: 45
По умолчанию

я пытался условиями
что то вроде
Код:
	    case XK_KP_5:
	      if( keyevent->type == KeyPress )
    {
	    switch( keysym ){	      
	     case XK_KP_4:     
	        if( keyevent->type == KeyPress )
	         switch( keysym ){
		   case XK_KP_6:
		     std::cout << "СОБЫТИЕ" << std::endl;}
		     break;
	    }
	            	
	    }
GoldSieg вне форума Ответить с цитированием
Старый 12.04.2017, 11:36   #6
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Зачем спрашивать, если потом делать по своему?

У вашего подхода две проблемы:
а) Если комбинаций много, замудохаетесь писать вложенные switch/case. 10х10х10 - уже тысяча комбинаций. Дополнительно, если надо будет поменять комбинацию надо будет перетаскивать код.
б) Что будет если нажат 5546? Первый обработчик уйдет во второй, который ожидает 4 но там 5, комбинация не распознана, дальше 4 и 6 уже либо пробали, либо ввели нас неизвесно куда.

В дополнение, вашим способом, попробуйте реализовать возврат, ну типа back space...
waleri вне форума Ответить с цитированием
Старый 12.04.2017, 12:47   #7
GoldSieg
Пользователь
 
Регистрация: 02.10.2011
Сообщений: 45
По умолчанию

Цитата:
Сообщение от waleri Посмотреть сообщение
Зачем спрашивать, если потом делать по своему?
Дак я ваших предложений не понял.
А алгоритм такого решения я хотя бы понимаю, вот только так не работает, ну и да надо как то обрабатывать ситуации типо "5546"
GoldSieg вне форума Ответить с цитированием
Старый 12.04.2017, 16:43   #8
alexzk
Форумчанин
 
Регистрация: 12.04.2017
Сообщений: 889
По умолчанию

На коленке набросал, не компилил (для будущих поколений - это стандарт С++11, при более старом будут ошибки - как чинить - дальше по теме):

Код:
#include <deque>
#include <vector>

using key_t = decltype(XK_KP_5);
const static std::vector<key_t> pattern{XK_KP_5, XK_KP_5, XK_KP_4, XK_KP_6};//not sure real constants, put propers
static std::deque<key_t> que;
if( keyevent->type == KeyPress )
{
    que.push_back(keysym);
    while (que.size() > pattern.size())
        que.pop_front();
    
   
   if (pattern.size() == que.size())
   {
        bool match = true;
        for (size_t i = 0, sz = que.size(); i < sz && match; ++i)
        {
            match = match && pattern.at(i) == que.at(i);
        }
    
        if (match)
        {
         //have pattern pressed, do some
        }
    }
}
В итоге, любую комбинацию можно задавать в pattern{} без других изменений.

Последний раз редактировалось alexzk; 13.04.2017 в 15:35.
alexzk вне форума Ответить с цитированием
Старый 13.04.2017, 11:22   #9
GoldSieg
Пользователь
 
Регистрация: 02.10.2011
Сообщений: 45
По умолчанию

Ругается
error: expected nested-name-specifier before 'key_t'
GoldSieg вне форума Ответить с цитированием
Старый 13.04.2017, 11:22   #10
GoldSieg
Пользователь
 
Регистрация: 02.10.2011
Сообщений: 45
По умолчанию

как я понял это связано с компилятором, но я не могу его поменять.

Последний раз редактировалось GoldSieg; 13.04.2017 в 11:27.
GoldSieg вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программная генерация нажатия комбинации клавиш в jQuery Abimeleh JavaScript, Ajax 5 07.09.2015 16:49
Имитация нажатия комбинации клавиш! stalsoft C# (си шарп) 2 24.06.2011 00:13
Назначить действие комбинации кнопок обычной 3-кноп. мыши SVGuss Софт 0 11.03.2011 19:00
Комбинации клавиш Alessandro Rossi Свободное общение 8 28.11.2010 23:30
Имитация нажатия комбинации клавиш Zeraim Win Api 15 05.05.2008 20:35