LINUX.ORG.RU

Сопоставить символы из разных раскладок между собой

 


0

2

Приветствую.
Гипотеза - на каждой нормальной клавиатуре, ориентированной на представителя любой культуры говорящего на любом языке на клавишах вторым рядом выбита латиница.

Как без заморочек о типах раскладок (всякие QWERTY и AZERTY) получить латинскую букву передав на вход что-то из нелатинской раскладки? Например:

char translate(wchar_t sym);
cout << translate(L'й')
     << translate(L'ц')
     << translate(L'у')
     << translate(L'к')
     << translate(L'е')
     << translate(L'н');
// cout: qwerty

Т.е. какая-то либа, которая спросит у системы тип клавиатуры, может раскладки, и даст ответ, на регистр можно забить и всегда выдавать в нижнем или верхнем.

★★

Надо искать «char to virtual key» и быть готовым, что большинство ссылок будет про WinAPI. Если делать самому, можно посмотреть как клавиатурные события обрабатываются в Qt или GTK.

u-235
()

Именно буква нужна на входе? Эту информацию можно достать раньше, из события клавиатуры X. Деталей не помню, но я это делал, исходник тоже где-то есть. Ещё нужно учесть, что бывают японские клавиатуры, в которых тупо больше кнопок. Что тогда делать?

den73 ★★★★★
()
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от den73

Ещё нужно учесть, что нарисованная на кнопке латинская буква не прибита гвоздями к линуксу - английские раскладки тоже бывают разные.

den73 ★★★★★
()
Последнее исправление: den73 (всего исправлений: 1)
Ответ на: комментарий от den73

английские раскладки тоже бывают разные

В этом и дело. Я хз как решить эту задачу без готового варианта, ибо нет возможности экспериментировать с разными клавиатурами. Так в теории есть XKeysymToKeycode(), который конвертит keysym в keycode, но я не уверен, что это мне поможет т.к. при нажатии на какую-то кнопку на разных раскладках я получаю идентичные keycodes, при этом я загуглил изображение раскладки AZERTY с русскими буквами в другом ряду - буквенные пары не совпадают, если на QWERTY - Q:Й, то на AZERTY - A:Й. Не знаю, будет ли совпадение keycodes на разных раскладках у AZERTY и QWERTY или нет.

А побудило меня на всё это желание назначить шорткаты софтине латиницей и сохранение поведения при смене раскладки (например - dd, cc, yy, …).

kvpfs ★★
() автор топика
Последнее исправление: kvpfs (всего исправлений: 1)

Может у кого-то есть не QWERTY клава? Я бы состряпал небольшой тест.

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

Ооо, респект и уважуха тебе. Я в своё время делал для линукса такой вариант, в котором в кириллической раскладке можно удерживать пробел и при этом будет вводиться латиница. Для этого в т.ч. надо было сделать свою раскладку. Вот рецепт, там много лишнего для тебя.

https://bitbucket.org/budden/iaroklava-js/src/master/linux/Яроклава-для-debian-stretch-lxde.md

Но там перечислены те файлы, которые могут дать тебе ответ, а именно usr/share/X11/xkb/symbols/ru . Если откроешь там же файл gb, там будут английские раскладки. Это раскладки. Но в инсталляторе линукса есть и выбор клавиатуры. Если там вдруг попадётся среди этих клавиатур AZERTY, то нужно найти тот файл, где эта клавиатура (не раскладка, а оборудование) описана - я, честно сказатЬ, не знаю где, и забил на эту проблему. И уже в этом файле будет понятно, что на что мапится. Я, кстати, думаю, что это /usr/share/X11/xkb/keycodes - там каждый файл - это вид клавиатуры (оборудования). Соответственно, есть скан код из оборудования, есть символические имена типа <AE01>, которые вычисляются в xkb/keycodes, далее они уже превращаются в имена (не знаю как называются), такие как w или quotedbl.

Т.е., не имея клавиатуры AZERTY, ты можешь попробовать понять её работу, глядя на xkb/keycodes.

Но это не точно :)

den73 ★★★★★
()
Последнее исправление: den73 (всего исправлений: 2)
Ответ на: комментарий от kvpfs

Может у кого-то есть не QWERTY клава? Я бы состряпал небольшой тест.

Есть. И что надо?

Я вот захреначил свою раскладку и под us и под ru.
По поводу Windows - надо писать драйвер или пользоваться немцами:
https://github.com/Rojetto/ReNeo/blob/master/README_EN.md

Для Linux всё намного проще. Опять же, тырим у немцев (по ссылке выше ищем основной репо)

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

Кринж по ссылке.

Делаем, чтобы пробел был и модификатором, и пробелом (xcape)

Точно, так и надо говнарить. Нет слов, одни маты. Так и не смог ты её пользовать?

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

Если делать самому, можно посмотреть как клавиатурные события обрабатываются в Qt или GTK.

Если делать самому код под GPL.

Если делать самому для работы, то этот совет поведёт компанию под суд…

Если уж советовать смотреть код библиотек, то нужно выбирать библиотеки под свободными лицензиями, код из которых можно использовать без анальных ограничений GPL/LGPL.

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от den73
  • редактируем системные файлы

  • обновляемся

?????

  • НЕ ПРОФИТ
anonymous
()
Ответ на: комментарий от fsb4000

Если делать самому для работы, то этот совет поведёт компанию под суд…

Покажите мне, где я советовал скопировать и спрятать исходники? Могу ошибаться, но за повторение алгоритма в России не сажают. Тем более, что ТС и не нужно это повторение.

Если уж советовать смотреть код библиотек, то нужно выбирать

Позвольте мне самому решать что, где и когда советовать.

u-235
()
Ответ на: комментарий от u-235

Если делать самому, можно посмотреть как клавиатурные события обрабатываются в Qt или GTK

Так говно совет.

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

Позвольте мне самому решать что, где и когда советовать.

Да без проблем. Подводите под статью.

У каждого своя голова на плечах.

Моё мнение, что на форуме про Linux, советы о нарушении GPL должны пресекаться.

В соседнем разделе даже тема такая есть: Нарушения GPL

fsb4000 ★★★★★
()
Последнее исправление: fsb4000 (всего исправлений: 1)
Ответ на: комментарий от fsb4000

Посмотреть и скопировать код - это не одно и то же. Но если кто-то так боится, то можно посмотреть, как сделано в tcl/tk.

den73 ★★★★★
()

Гипотеза - на каждой нормальной клавиатуре, ориентированной на представителя любой культуры говорящего на любом языке на клавишах вторым рядом выбита латиница.

ТС - ты лох тупой. Иди забанься. Иди на https://keyboard-design.com/best-layouts.html, там таких любят, ага. Втирали на скорость 10 лет, а оказалось, что неправильно вёлся подсчёт.

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

Есть. И что надо?

Я порылся в /usr/share/X11/xkb - не прокатит keycodes раскладок не привязаны к латинице никак.

kvpfs ★★
() автор топика

Sorry за то что сейчас суждение выскажу не по теме треда.

Старые кодировки:
https://docs.oracle.com/javase/6/docs/technotes/guides/intl/encoding.doc.html
https://neerc.ifmo.ru/wiki/index.php?title=Представление_символов,_таблицы_кодировок
https://hrwiki.ru/wiki/Character_encoding

Так вот их архитектура была «не очень».
Вины ничьей в этом нет потому, как в далекий 1812 год еще мысли категориями перфораторов.

Ныне вполне реально создать хорошую архитектуру однобайтовых кодировок и API для работы с ними.

Профит будет в том, что по сравнению с нынешними кодировками много эффективней будут функции для анализа/сравнения и.т.д. символов.
А это весьма важно так как ныне доминирует текстовое представление данных и информации.

Обязательно произведу разработку API для работы с ними.

Понятно, что многим НАПЛЕВАТЬ, но меня это особенно

НЕ ВОЛНУЕТ ...
anonymous
()
Ответ на: комментарий от AKonia

Scancode вместо keycode ?

Не, это тоже всё не то. Я хочу простого - есть некоторая поделка, есть шорткаты к ней в виде всяких ‘dd’, хочу прописать их на латинице один раз и они должны быть работоспособны не только на ‘us’. Можно взять keycode, но привязка к конкретному типу клавиатуры, на другой всё сломается (у юзера AZERTY вместо QWERTY). Сканкоды - ещё более низкоуровневое.

Есть такое. Т.е. по идее можно заставить работать схему - конвертим символ в keycode, меняем раскладку на ‘us’, конвертим обратно в символ, возвращаем раскладку. Но как-то это сильно костыльно, не хочется.

kvpfs ★★
() автор топика
Последнее исправление: kvpfs (всего исправлений: 1)
Ответ на: комментарий от kvpfs

У тебя знаний не хватит такую хотелку сделать.

Универсальность горячих сочетаний идёт лесом, если ты не шпрехаешь в scancode. Так поступил Steam. Им плевать на твою раскладку. Они читают и выводят по внутренней таблице. Но мозга не хватит разобраться… Рекомендую тему свернуть.

anonymous
()

Очевидно, не передавать на вход что-то из локалицы, а слушать события на уровне, предшествующем той трансляции.

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

Что тогда делать?

Наслаждаться наличием под большими пальцами чего-то кроме одного пробела шириной в страну мою родную.

Что за вопрос? Читать сканкоды, что делать.

t184256 ★★★★★
()
Последнее исправление: t184256 (всего исправлений: 1)
Ответ на: комментарий от anonymous

хорошую архитектуру однобайтовых кодировок

Профит будет в том, что по сравнению с нынешними кодировками много эффективней будут функции для анализа/сравнения и.т.д. символов.

Владимир, ты?

anonymous
()

Спасибо.

В общем забью-ка я лучше на это. Начинает доходить почему во всяких Vim’ах и emacs’ах существуют эти костыли в виде собственных переключалок. Если под иксами выкрутиться ещё как-то можно (хотя выглядит как лютый костыль), то что делать под VT - хз. Ковырять сканкоды от разных клав и поддерживать это всё самостоятельно - ну нахер.

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

Ковырять сканкоды от разных клав и поддерживать это всё самостоятельно - ну нахер.

Sorry

Широка страна моя РОДНАЯ.  
Много в ней кодировок и заботе о человек.   
Я другой такой страны не знаю, где так ВОЛЬНО ДЫШИТ ПРОГРАММИСТ!
anonymous
()
Ответ на: комментарий от kvpfs

желание назначить шорткаты софтине латиницей

От такого хорошо помогает разлатинизация головного мозга.

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

вполне реально создать хорошую архитектуру однобайтовых кодировок

Реально ли для начала создать хороший однобайт?

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

В ИТ есть только латиница, всё остальное - юзерфрендли игрушки для домохозяек. Это не я так решил, а Юникод окончательно закрепил такое положение дел, работа с символами выше ASCII - дорого, сложно и костыли, особое удовольствие от композиций/декомпозиций. Далеко ходить не надо - у меня в терминале неправильно отображается ‘Ё’ в виде декомпозиции const wchar_t src[] = L"\u0415\u0308"; cout << src << endl;. Поделки прогеров - костыль на костыле, сходил сюда, ожидаемо получил невалидную работу в случае скармливания поделке юникодных декомпозиций (это отдельный баг несвязанный с терминалом). В общем пусть все эти ребята из консорциума берут свою ужасную ICU и сами пишут тормозной ширпотреб для девочек из бухгалтерии, так страдать из-за работы с текстом лично я не собираюсь.

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

В ИТ есть только латиница, всё остальное - юзерфрендли игрушки для домохозяек.

Просто англосаксонский мир разработал архитектуру работы с кодовыми страницами удобными для них.
Да и в 1812 году были такие-же приоритеты при разработке.
Выше был пост о том, что нужно разработать новую архитектуру кодовых страниц.
Немножко скажу об недостатке к примеру CP1251 кодовой страницы.

1) Коды с 0 по 31 являются управляющими.
   Зачем их тулить во все страницы.

2) Имеются набор кодов для строчных и прописных букв.
   Зачем если достаточно одного флага в коде символа, который 
   будет уведомлять об этом.
...

Воообщем

РАЗРАБОТАЮ новые кодировки и API для работы с строками ...
anonymous
()
Ответ на: комментарий от kvpfs

Ну как это возможно? Никто не замечает как оно всё криво?

#include <iostream>
#include <string>
#include <locale>
 
template<typename CharT>
void try_compare(const std::locale& l, const CharT* p1, const CharT* p2) {
    auto& f = std::use_facet<std::collate<CharT>>(l);
 
    std::basic_string<CharT> s1(p1), s2(p2);
    int res = f.compare(&s1[0], &s1[0] + s1.size(),
                 &s2[0], &s2[0] + s2.size() );
    if (res < 0)
         std::wcout << p1 << " before " << p2 << '\n';
    else if (res > 0)
         std::wcout << p2 << " before " << p1 << '\n';
    else
        std::wcout << p2 << " equal " << p1 << '\n';
}
 
int main() {
    std::locale::global(std::locale("ru_RU.utf8"));
    try_compare(std::locale(), L"\u0415\u0308", L"\u0401");
}


$ g++ 1.cpp
$ ./a.out > out
$ что_умееющее_юникод out
Ё before Ё

Причём локаль берётся у системы, т.е. даже на таком уровне все кладут на этот Юникод получается.

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

Так это просто англосаксы с помощью юникода так пытаются удержать мир в подчинении. Потому что, в отличие от программистов, они понимают, что буковки - это инструмент не для домохозяек, а для власти.

den73 ★★★★★
()
Последнее исправление: den73 (всего исправлений: 2)
Ответ на: комментарий от ya-betmen

Почему?

Потому что лицензии нельзя нарушать.

Даже если случайно на форуме увидел GPL код связанный с тем же, что ты делаешь на работе, то лучше пару дней не работать над этой задачей, чтобы успеть забыть.

А целенаправлено смотреть как код выполняется под GPL и потом публиковать его не под GPL это нарушение лицензии. Там об этом явно написано, притом уточнено, что даже переписывание на другой язык это тоже нарушение GPL.

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

Там об этом явно написано, притом уточнено, что даже переписывание на другой язык это тоже нарушение GPL.

Почти патент …

Шутка

За «переписывание» моего кода for ( int NumItem = 1; NumItem <= cntStream; NumItem++ ) {

ЗАСУЖУ!
anonymous
()
Ответ на: комментарий от fsb4000

И сам вопрос тоже хорош: https://softwareengineering.stackexchange.com/q/151515

В law, я не «law».
Объясните все же правовую значимость GPL о недопустимости переписывания алгоритма на другой язык программирования …

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

Не понял где связь

Если делать самому для работы

и

потом публиковать его не под GPL

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