Серверная (www.it-simple.ru)

Первоапрельский розыгрыш. абвгде-клавиатура в Windows и Linux


В прошлом году был популярный розыгрыш с клавиатурой (http://www.yaplakal.com/forum2/topic181081.html), когда клавиши менялись в раскладку АБВГДЕ, в соответствии с рисунком ниже.

Самый смак такого прикола - заставить изнасилованную отвёрткой клавиатуру работать как надо. Чтобы каждый её режим (русская, английская раскладки, с шифтом и без шифта, с капслоком) работал как надо, чтобы все символы с такой клавиатуры можно было печатать в соответствии со значками на клавишах.

Наш дружный айтишный коллектив решил шутить над шефом.

Для реализации задуманного в виндуз народ использовал программу AKey (http://www.comfort-software.com/downloads.php?host=cs&name=ak_setup.exe), но наш клиент работал под линухом, что заставило немного напрячь мозг.

Реализация в Ubuntu 8.04

Сначала я хотел просто сделать новую русскую раскладку, назвать её как-нибудь типа ru-winkeys-izvrat, но это не принесло бы нужного результата, потому что латинский алфавит и спецсимволы оказались бы не на своих местах.

Решение возникло на основе того, что линух хранит коды клавиш клавиатуры в отдельном файле /usr/share/X11/xkb/keycodes/xfree86. Оставалось только переназначить клавиши (рутиная работа), заменить оригинальный файл (сделав его копию, естественно) и подгрузить в систему, для надёжности - перезагрузкой всего компьютера.

При редактировании /usr/share/X11/xkb/keycodes/xfree86 важно понимать одну вещь. Постоянная величина клавиши (в смысле места на клавиатуре, вне зависимости от того, что изображено на самой клавише) - это её код. Если у клавиши с изображением «`~ё» код 49, то какую клавишу вместо неё ни поставь - у неё тоже будет код 49. А вот <TLDE> - это как раз описание клавиши, которое указывает на то, что при нажатии на неё выдаётся один из символов из «`~ё», в зависимости от раскладки и сигнальных клавиш.

То есть, при написании <TLDE>=30 мы не переопределяем код клавиши. Мы указываем, что у клавиши с кодом 30 (конкретное место на клавиатуре) будет набор символов <TLDE>.

Ниже - исправленное содержимое файла xfree86.

...
// Пропущенное содержимое буду обозначать троеточием, чтобы не загромождать код

// Здесь начинается описание клавиатуры. Нас интересует алфавитная часть,
// а именно - строка цифр и три строки букв.

xkb_keycodes "basic" {

    minimum= 8;
    maximum= 255;

// Здесь начинается строка цифр, от тильды до "Backspace".
    <TLDE> =  30; //49; //ё-,
    <AE01> =  11; //10; //1-0
    <AE02> =  12; //11; //2-1
    <AE03> =  13; //12; //3-2
    <AE04> =  14; //13; //4-3
    <AE05> =  15; //14; //5-4
    <AE06> =  16; //15; //6-5
    <AE07> =  17; //16; //7-6
    <AE08> =  18; //17; //8-7
    <AE09> =  19; //18; //9-8
    <AE10> =  10; //19; //0-9
    <AE11> =  20;
    <AE12> =  21;
    <BKSP> =  22;

// Здесь пошли буквы.
// Строки (в соответствии с клавиатурой) сохранялись только в оригинальном написании.
// После нашей редакции получился просто список соответствий клавиш и кодов.
    <TAB>  =  23;
    <AD01> =  34; //24; //й-а
    <AD02> =  52; //25; //ц-б
    <AD03> =  46; //26; //у-в
    <AD04> =  35; //27; //к-г
    <AD05> =  29; //28; //е-д
    <AD06> =  40; //29; //н-е
    <AD07> =  27; //30; //г-ё
    <AD08> =  54; //31; //ш-ж
    <AD09> =  55; //32; //щ-з
    <AD10> =  32; //33; //з-и
    <AD11> =  48; //34; //х-й
    <AD12> =  56; //35; //ъ-к
    <RTRN> =  36;

    <CAPS> =  66;
    <AC01> =  47; //38; //ф-л
    <AC02> =  57; //39; //ы-м
    <AC03> =  26; //40; //в-н
    <AC04> =  24; //41; //а-о
    <AC05> =  42; //"п" и "р" остаются на своих местах
    <AC06> =  43;
    <AC07> =  41; //44; //о-с
    <AC08> =  38; //45; //л-т
    <AC09> =  28; //46; //д-у
    <AC10> =  31; //47; //ж-ф
    <AC11> =  59; //48; //э-х

    <LFSH> =  50;
    <AB01> =  61; //52; //я-ц
    <AB02> =  53; //"ч" - на своём месте
    <AB03> =  44; //54; //с-ш
    <AB04> =  39; //55; //м-щ
    <AB05> =  33; //56; //и-ъ
    <AB06> =  45; //57; //т-ы
    <AB07> =  58; //"ь" - на своём месте
    <AB08> =  25; //59; //б-э
    <AB09> =  60; //"ю" - на своём месте
    <AB10> =  49; //61; //.-я
    <RTSH> =  62;

...

Кстати, если вы обратили внимание, верхний ряд нашей клавиатуры тоже изменён. Цифры считаются не от 1 до 0, а от 0 до 9.

Я надеюсь, у вас есть ssh-доступ к подопытной системе. Вам ещё обратно всё возвращать, а с абвгде-клавиатурой это не так и просто, особенно с нетривиальным паролем рута :)

PS. Год назад, когда мы это сделали, шеф первым делом пошёл на склад менять клавиатуру. Ха!