LINUX.ORG.RU
ФорумJob

за деньги напишите - отследить нажатие Ctrl+Shift


0

1

Ребята напишите за деньги программу на Си для отслеживания нажатия клавиш Ctrl+Shift ? Хочу для текстового режима повторяю для текстового в режиме фреймбуфера (иксов нет) не для графического в Linux сделать индикатор переключения раскладки клавиатуры.
Что бы при нажатии на эти клавиши выводилось то Rus то Usa на консоль. В принципе не обязательно следить реально какая сейчас раскладка, просто при загрузке раскладка английская и сразу выводиться Usa, а потом при нажатии просто меняется то Rus то Usa и всё.
Именно выводилась просто строка Rus или Usa, я хочу сделать вывод её в строку состояния терминального менеджера screen. Я пробовал выводить скриптом слова на консоль и если это всё сделать в строке состояния screen то там тоже всё выводиться, только на английском, если на русском то выводятся каракули (не совпадает кодировка) почему я не разобрался.
За дополнительную плату если это не трудно и не трудоёмко хотелось бы что бы выводился флажок соответствующей страны (текстовая консоль у меня работает в режиме фреймбуфера) но повторяю иксов нет, просто фреймбуфер с разрешением 1024x768 Я пробовал командой fbi выводить jpg картинки, так они выводятся всё нормально. Но повторяю флажок должен выводиться в строке состояния screen это в правом нижнем углу.
Если кого заинтересовало моё предложение напишите w456cv@mail.ru
Стоимость и дальнейшие моменты давайте обсудим по почет.

★★

http://www.rjsystems.nl/en/2100-hotkeys.php - вы можете попробовать сделать нужную фичу сами по этому гайду.

Вторая не получится скорее всего. Скрин-то с графикой работать не обучен.

Hoodoo ★★★★★ ()

> почему я не разобрался
screen не поддерживает utf-8 в строке состояния.

Но повторяю флажок должен выводиться в строке состояния screen это в правом нижнем углу.

Варианты:
1) Прицельно писать картинку в то место фреймбуффера, где располагается строка состояния screen. При этом никто не должен пытаться перерисовать этот кусок экрана, иначе картинка исчезнет.
2) На лету модифицировать шрифт знакогенератора так, чтобы определённому символу соответствовал флажок; выводить этот символ в строку состояния. Костыльно, требует прав root и позволяет не более чем 2-цветные картинки.
3) Отказаться от использования флажков и выводить только текст.

Перехват нажатия клавиш - тоже занятие довольно весёлое. Можно, например, получить права root и разбирать данные из /dev/input/*.

AITap ★★★★★ ()

actkbd-подобное? Оно потребует рута.

x3al ★★★★★ ()

отслеживания нажатия клавиш Ctrl+Shift
.... в режиме фреймбуфера (иксов нет) ...

Программа Actkbd. Она берёт события о нажатии клавиш из /dev/input. Может работать без иксов.

в правом нижнем углу.

Часики для консоли. Пишет в /dev/vcs. http://linsovet.com/clock-in-console Её надо переделать чтобы вместо времени выводила текст: rus, eng. И другое место на экране указать.

------------------------------------------------------------------------

Для доступа програмы Actkbd к /dev/input без рутовых прав.

Создать дополнительную группу.

groupadd devinput
Пользователя добавить в эту группу.
usermod ...

Изменить правила udev чтобы файлы в /dev/input создавались с нужной группой.

/lib/udev/rules.d/26:50-udev-default.rules

Найти это

KERNEL=="mouse*|mice|event*",   NAME="input/%k", MODE="0640"
Заменить на это
KERNEL=="mouse*|mice|event*",   NAME="input/%k", MODE="0660", GROUP="devinput"

------------------------------------------------------------------------

Чтобы писать на экран в /dev/vcs без рутовых прав.

Создать дополнительную группу.

groupadd devvcs
Пользователя добавить в эту группу.
usermod ...

Замонтировать диск с опцией acl. Смотри в /etc/fstab.

В системе после старта udev добавить специальный скрипт. В каждом дистрабутиве линукса по разному указывается куда добавить. У меня в слакваре я назвал его «/etc/rc.d/rc.vcs» и добавил в конец «/etc/rc.d/rc.M» строки

if [ -x /etc/rc.d/rc.vcs ]; then
  . /etc/rc.d/rc.vcs
fi

rc.vcs

#!/bin/sh

# rc.vcs

# Скрипт ополнительно к группе tty добавит группу devvcs.
# Диск должен быть замонтирован с опцией acl.

# Test.
# set -e
# set -v

echo "Add group devvcs rw to /dev/vcs*."

# for FILE_VAR in test/dev/vcs*
for FILE_VAR in /dev/vcs*
do
    # if [ "${FILE_VAR}" = "test/dev/vcs*" ]
    if [ "${FILE_VAR}" = "dev/vcs*" ]
    then
        continue
    fi
    
    echo "ACL. Add group \"devvcs\" to file \"${FILE_VAR}\"."

    COMMAND="setfacl -m g:devvcs:rw -- ${FILE_VAR}"
    ${COMMAND}
    if [ "${?}" != "0" ]
    then
        echo Error. COMMAND = ${COMMAND}
    fi
done

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

Итого имеешь пользовательский доступ к /dev/input, /dev/vcs*.

Переделать «Часики для консоли» чтобы выводила текст rus, eng. И другое место на экране указать.

Устанавливаешь actkbd. В $HOME/.bash_profile записываешь автозапуск actkbd. В actkbd настраиваешь на хоткей ctrl+shift запуск переделаных часиков.

Тут возникает вопрос : а в какой /dev/vcs* писать ?

Есть идея что можно до запуска actkbd в $HOME/.bash_profile записать команду которая будет сохранять текущий tty* в файл и затем по его номеру tty* узнавать номер /dev/vcs*.

Но можно наверное и сразу во все семь (у меня семь) /dev/vcs* писать.

Экран только с текстом

/dev/vcs 
/dev/vcs1 
/dev/vcs2 
/dev/vcs3 
/dev/vcs4 
/dev/vcs5 
/dev/vcs6 
/dev/vcs7 

Экран с текстом и с атрибутами, цветами

/dev/vcsa 
/dev/vcsa1 
/dev/vcsa2 
/dev/vcsa3 
/dev/vcsa4 
/dev/vcsa5 
/dev/vcsa6 
/dev/vcsa7

Остаётся вопрос : как фоново запущенному процессу (из actkbd) узнать (определить) текущую выбранную (активированную) консоль, которая сейчас на экране ?

someloruser ()

> при нажатии на эти клавиши выводилось то Rus то Usa на консоль

что бы выводился флажок соответствующей страны


если не так уж и критично «Rus/Usa на консоль» или «флажок куда-то», то может проще использовать лампочку Scroll Lock как индикатор? типа «светит = RU», «не светит = EN»

и подозреваю, что такую штуку можно и без Си сделать

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

Сохранение vcs текущей консоли.

$HOME/.bash_profile

tty | sed 's/\(tty\)/vcs/gi' > ${HOME}/.current_dev_vcs.txt

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

Остаётся вопрос : как фоново запущенному процессу (из actkbd) узнать (определить) текущую выбранную (активированную) консоль, которая сейчас на экране ?

vtgrab как-то определяет, глянь туда.

Ну или может man ttyname ?

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

Я имел в виду как вариант вместо рисования на экране, включать и выключать светодиод на клавиатуре, и с помощью програмы Actkbd запускать setleds.

someloruser ()
Ответ на: комментарий от q11q11

Огромное спасибо всем кто помогает.
Сейчас пробую вариант с actkbd только что то не работает эта программа.
Скачал, установил, всё нормально.
В пустом конфиге прописал:
29+42:key:exec:pwd &

просто посмотреть работает она или нет

запускаю actkbd -D -q

запускается всё нормально но при нажатии Ctrl+Shift ничего не происходит хотя должна написать в каком каталоге я сейчас нахожусь

v4567 ★★ ()

гуру screen-а!

а может как-то можно это всё обыграть через bind/bindkey в .screenrc?
можно ли так цеплять выполнение внешних shell-скриптов на хоткеи?

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

Укажи Actkbd параметром "-d" устройство из папки /dev/input/by-id. Клавиатуре соответствует файл содержащий в имени «kbd».

Для проверки запусти Actkbd в тестовом режиме с аргументами
-x -s -v
без аргументов
-D -q

.

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

Может кому пригодится опишу настройку actkbd

В папке пользователя создал три файла:
первый
~/scripts/raskl/rus

russ=true

второй

~/scripts/raskl/rus.sh

#!/bin/bash

. ~/scripts/raskl/rus

if $russ
then
echo «Eng»
else
echo «Rus»
fi


третий

~/scripts/raskl/rus1.sh

#!/bin/bash

. ~/scripts/raskl/rus

if $russ
then
echo «russ=false» > ~/scripts/raskl/rus
else
echo «russ=true» > ~/scripts/raskl/rus
fi

В файлы /etc/bashrc /etc/profile ~/.bash_profile ~/.bash_logout ~/.bashrc ~/.profile

добавляю строку echo «russ=true» > ~/scripts/raskl/rus

В файл /etc/actkbd.conf

вписываю 29+42:key:exec:~/scripts/raskl/rus1.sh

всё остальное коментирую

actkbd запускаю вот как:

actkbd -D -q -d /dev/input/event2

-d /dev/input/event2 обязательно потому что actkbd сам не может определить файл устройства клавиатуры, хотя в документации написано что это писать не обязательно и actkbd должен этот файл определить.

файл устройства клавиатуры у всех может быть разный, узнать можно глянув в каталоге /dev/input/by-id или /dev/input/by-path ссылку в которой есть сочетание kbd на какой файл она указывает тот и писать

в файле ~/.screen пишу следующее

backtick 1 2 2 ~/scripts/raskl/rus.sh
caption always «|%n|%t|%=|%1`|%c|%d %m %Y|»

теперь при нажатии на Ctrl+Shift в строке состояния screen там где дата и часы будет и переключение раскладки то Rus то Eng

это переключение никак не связанно с реальным состоянием дел какая сейчас раскладка, поэтому при выходе раскладку переключаю на английскую и автоматом в файл rus в переменную будет заноситься true

Если actkbd запускать как демон с параметром -D и если в запускаемой им программе бедет вывод на консоль echo то он не будет выводиться при этом изменения в файл rus будут заноситься.
Если же запускать actkbd в фоне через & то тогда echo будет выводиться на консоль, только командная строка будет возвращена после нажатия на энтер.

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