автоповорот екрана для linux

чорнова версія скрипту для автоповороту екрана між портретним та пейзажним режимами для linux — працює.

запуск:

tabletizer --cont

якщо не вказати параметр --cont, скрипт відпрацює один раз і завершиться; --cont [інтервал] запускає циклічне опитування акселерометра зі вказаним інтервалом в секундах (за замовчуванням 1 с).

виявилося, що гістерезис для повороту все ж таки має враховувати всі три осі, а не лише x, як я собі гадав на початку.

залежностей мінімум: xrandr, xinput, grep, sed. перевірено лише на aspire r13 (r7-371t) з arch linux (manjaro kde), але і на інших «трансформерах» та під іншими дистрибутивами теж має працювати (можливо, з невеликими модифікаціями), якщо встановлено відповідні драйвери для linux industrial i/o.

можуть бути вади, пов'язані з кількома моніторами чи робочими просторами (як в kde) — поки що не мав часу все перевірити.



в планах на колись (коли буде натхнення):
  • «причесати» код, особливо в частині перемикання (гістерезис);
  • додати опцію відкривання екранної клавіатури;
  • позбутися залежності від sed (малесенький фрагмент, що я запозичив готовий, треба переписати).
екранна клавіатура onboard досить бідна на опції командного рядка… але відкривати та закривати її програмно таки можна — за допомогою повідомлень dbus.

відкриваємо:

onboard && dbus-send --type=method_call --print-reply --dest=org.onboard.Onboard /org/onboard/Onboard/Keyboard org.onboard.Onboard.Keyboard.Show > /dev/null

"onboard &&" на початку — простіше, ніж перевіряти, чи програму вже запущено.

закриваємо:

dbus-send --type=method_call --print-reply --dest=org.onboard.Onboard /org/onboard/Onboard/Keyboard org.onboard.Onboard.Keyboard.Hide > /dev/null

перемикаємо (toggle):

dbus-send --type=method_call --print-reply --dest=org.onboard.Onboard /org/onboard/Onboard/Keyboard org.onboard.Onboard.Keyboard.ToggleVisible > /dev/null
проблему випадкового монтування сенсорів вирішив: нова версія скрипта test_sensors самотужки шукає потрібний сенсор у теці /sys/bus/iio/devices:



все готово для збирання докупи скрипта автоповороту екрана.

сенсори та linux (продовження)

невеликий проміжний підсумок експериментів з сенсорами на aspire r13: linux (в моєму випадку arch під капотом manjaro) від початку має необхідні драйвери для підсистеми industrial i/o та дає доступ до їх відгуків через дерево підтек і текстових файлів:

/sys/bus/iio/devices/
└ iio:device0/             # магнетометр
  └ ...
└ iio:device1/             # датчик нахилу?
  └ ...
└ iio:device2/             # датчик кутової швидкості?
  └ ...
└ iio:device3/             # акселерометр
  ├ in_accel_x_raw         # вісь x: кут нахилу в площині екрана
  ├ in_accel_y_raw         # вісь y: кут нахилу екрану на себе/від себе 
  ├ in_accel_z_raw         # ?
  └ ...
└ iio:device4/             # ?
  └ ...
└ iio:device5/             # сенсор освітлення
  ├ in_illuminance_raw     # рівень освітленості (підозрюю, що в десятих люкса)
  └ ...

при цьому сам manjaro ніяк ці дані не використовує: вочевидячки, дистрибутив просто не призначений для пристроїв-трансформерів чи планшетів.

тож я накидав невеликий (і дуже чорновий) скрипт оболонки, котрий інтерпретує дані від акселерометра і сенсора освітлення (можливо, поки що не дуже коректно) і дозволяє погратися з ними — себто, покрутити ноутбуком на всі боки й спостерігати, як міняються показники:



що далі? зібрати докупи три різних скрипти, що вже маю:
  • універсальний повертач екрану/тактильного екрану
  • перемикач режиму (пейзаж/портрет)
  • скрипт інтерпретування сенсорів…
…у один автоматичний перемикач режиму ноутбук/планшет залежно від нахилу. отже, як каже один добрий сусіда наприкінці кожного допису — не перемикайтеся =)

поновлення (2018-12-22): халепа! під час завантаження сенсори монтуються до тек device0...device5 суб'єктивно випадковим чином… себто  після перезавантаження акселерометр опинився в теці device5 замість device3… себто треба шукати спосіб динамічно визначати, куди який сенсор змонтовано.
на продовження давнього допису:

lsmod | grep "^hid_sensor"

на aspire r13 видає вельми цікаві штуки: акселерометр, компас, гіроскоп, датчик освітлення (als)…

інша цікавинка:

udevadm info --export-db | grep -C 7 hid_sensor

треба гуглити, як до цього всього дотягнутися зі скрипта оболонки…

поновлення (21 грудня 2018): здається, знайшов…

watch -n 1 cat /sys/bus/iio/devices/iio:device3/in_accel_x_raw

показує посекундно кут нахилу ноутбука навколо поздовжньої осі. кодування, схоже, таке: значення 1—1'000 кодують нахил за годинниковою стрілою, а 64'536—65'535 (насправді це від'ємні 16-бітні цілі, старший біт 1) — нахил проти годинникової стрілки.

залишилося «наскриптувати» простенький сенсор, котрий запускатиме поворот екрану (цю частину вже маю) при нахилі на ±800—1000 за цією шкалою — себто приблизно в портретну орієнтацію.

задачка на інший день.

на баштані спека!

за вікном сьогодні сонячно і мінус 9°, але на баштані — спека!

це я «залип» на exercism.io — воно ж азартне, як не знати що! при цьому змушує думати й учитися.

приміром, вправа на підрахунок очок за слова для scrabble? перша версія використовувала пошук у масиві: алгоритм, який можна було б застосувати колись до якоїсь складнішої задачі:



але навіщо?! підглянув до чужих розв'язків, і переробив у значно простіший та читабельніший варіант з одним case:



так можна й навчитися =)

давно шукав щось подібне: exercism

ось таке знайшлося на linux.org.ua:

exercism.io

здається, аби лише завантажити й налаштувати цей курс, вже треба бути програмістом…

…але зате далі цікаво. щоправда, це самонавчання, по суті: жодних навчальних матеріалів (а навіщо, коли є tldp.org?), суто завдання і автоматизовані тести для перевірки. менторів поки що не бачив =)
новорічну ялинку прикрасили… тепер прикрасимо ping?


про prettyping вичитав на linux.org.ua. функцію закинув до ~/.bashrc — нехай буде.

p.s. і не забудьте ж про source ~/.bashrc, якщо гратиметеся й собі =)

system volume information

я вам точно кажу… якщо існує єдиний бог — він має що завгодно на своєму ноутбуці, але не windows…
цитата | «on drives formatted with the ntfs file system, this folder’s permissions are set to prevent everyone from accessing the folder, even users with administrator permissions» (звідси
адміністратор без доступу до якоїсь системної теки? пересторога столмана про те, що якщо ви не котролюєте код — код (а через нього, можливо, хтось інший?) контролює вас, набуває суттєвого змісту =)

передісторія: на на (зовнішньому) робочому диску лишилося вільних лише 80 гігабайт з 460. віртуальні машини для різних курсів у коледжі «з'їли» 258 гб — треба щось видаляти. але знайшлася ще тека system volume information (на диску встановлено windows, котрим я вже рік не користуюсь), майже 15 гб, тож я пішов гуглити, що воно таке…

телефон за $9

днями зазирнув до «village de valeur» (це така мережа крамниць вживаних речей), придбав за $9 старенький, але робочий sony xperia m. приніс додому — а він залочений, і не зрозуміло, на якого оператора…

нічого. обійшов кілька стендів мобільних операторів у місцевому торговому центрі, емпіричним методом (перепробували півдесятка карток) виявив — bell. зателефонував на службу підтримки — продиктували код розблокування, $0.

дорогою додому заскочив до wallmart'а, віддав $11,50 за картку sim з найдешевшим тарифним планом від publiс mobile: $11,50 на місяць (50 хвилин і 50 вихідних sms).


автор книжки «learning c with pebble», про яку я нещодавно згадував, щойно виклав на github вихідні коди вправ, котрі є реальними програмами для pebble — без них книжка не була повною (довелося трохи поштурхати дядька на reddit'і):

github.com/frethop/learningcwithpebble-exercises

без вправ — це був би просто ще один підручник з програмування на с. зі вправами — це можливість торкнутися коду й одразу наживо побачити результат на «камінчику». хапайте!

магія ijkl (продовження)

має бути якийсь кращий спосіб вирішити цю задачу… можливо, доведеться зробити свої версії обох розкладок, додавши до кожної всі потрібні налаштування?

поки що виклав два файли конфігурації (для xmodmap та xkbcomp) та малесенький скрипт для їх простого завантаження на github, щоби не пропало (і не забулося), поки я тут складатиму іспити в коледжі:

github.com/tivasyk/navijkl

далі треба буде «копа́ти» xkb.

магія ijkl

за два роки з компактною клавіатурою я дуже звик рухати курсор комбінацією fn+ijkl. а оскільки fn на pok3r'і можна призначити на capslock, то й для навігації текстом чи веб-сторінкою не доводиться відривати пальці від основного положення…

…проблема виникає тоді, коли треба бодай трішки щось зробити на іншій клавіатурі. отже, давня мрія: переналаштувати обробника клавіатури linux так, щоби capslock+ijkl (і кілька інших комбінацій) працювали, як на pok3r'і.

щойно подужав… але поки що не впетраю, як це до ладу автоматизувати. поки що просто занотую, як робиться руцями.

capslock

спершу я спробував зробити справу за допомогою xmodmap — вийшло лише частково. але принаймні переналаштування capslock працює:

! ----------------------------------------
! CapsLock працюватиме як ISO_Level3_Shift
! (третій рівень, зазвичай правий Alt)
! ----------------------------------------
clear lock
clear mod5
add mod5 = Caps_Lock ISO_Level3_Shift
keycode 66 = ISO_Level3_Shift Caps_Lock

це треба зберегти до текстового файлу (приміром, capslock.xmodmap) і завантажити:

xmodmap capslock.xmodmap

після цього capslock дублює функцію правого alt'а (який на моїх обох розкладках, канадській багатомовній та українській unicode, дає доступ до «третього шару» — символів на кшалт µ, {} ы тощо), але разом із shift'ом працює як звичайний capslock.

ijkl та латинка

в канадській багатомовній отримати навігацію з altr+ijkl можна так само за допомогою xmodmap. по-перше, можна експортувати поточну розкладку (xmodmap -pke) і підглянути налаштування саме для цих клавіш (grep):

xmodmap -pke | grep -e "^.*=\ *[ijkl]" > ijkl.xmodmap

маю щось таке у файлі ijkl.xmodmap:

keycode  31 = i I Cyrillic_sha Cyrillic_SHA NoSymbol NoSymbol rightarrow idotless
keycode  44 = j J Cyrillic_o Cyrillic_O NoSymbol NoSymbol U0133 U0132
keycode  45 = k K Cyrillic_el Cyrillic_EL NoSymbol NoSymbol kra NoSymbol NoSymbol NoSymbol Cyrillic_lje Cyrillic_LJE
keycode  46 = l L Cyrillic_de Cyrillic_DE NoSymbol NoSymbol U0140 U013F NoSymbol NoSymbol Serbian_dje Serbian_DJE

ліворуч (від =) коди клавіш на вході обробника клавіатури xorg. праворуч — те, що обробник подає на вихід, залежно від стану (shift, ctrl тощо). приміром, j та J — це символи (насправді псевдоніми) при нормальному натисканні та з shift'ом. далі — другий рівень (в моєму випадку українська розкладка), нормально та з shift'ом; тут вже добре видно, що це псевдоніми: cyrillic_sha (ш) та cyrillic_SHA (Ш).

емпіричним шляхом виявляю, що наступні два псевдоніми (NoSymbol NoSymbol) — це третій рівень першої розкладки, саме те, що вмикає правий alt: так само нормальний ввід та з shift'ом. міняю на псевдоніми потрібних дій:

keycode  31 = i I Cyrillic_sha Cyrillic_SHA Up Up rightarrow idotless
keycode  44 = j J Cyrillic_o Cyrillic_O Left Left U0133 U0132
keycode  45 = k K Cyrillic_el Cyrillic_EL Down Down kra NoSymbol NoSymbol NoSymbol Cyrillic_lje Cyrillic_LJE
keycode  46 = l L Cyrillic_de Cyrillic_DE Right Right U0140 U013F NoSymbol NoSymbol Serbian_dje Serbian_DJE

згодовую xmodmap'ові й маю бажану навігацію capslock+ijkl, але лише на першій розкладці, канадській:

xmodmap ijkl.xmodmap

 

ijkl та кирилиця

коли я спробував той самий фокус для української розкладки, здогадуючись (див. псевдоніми в рядках keycode 45 та 46), що 11-й та 12-й псевдоніми мають відповідати за третій рівень (altr) другої розкладки — виявилося, що [k] та [l] працюють, а от [i] та [о] — дзуськи. після не дуже результативного гугління поліз глибше — в налаштування xkb, і знайшов.

щоби вивантажити налаштування xkb до файлу layout.xkbcomp:

xkbcomp $DISPLAY layout.xkbcomp

по-перше, аліаси потрібних клавіш (коди 31, 44, 45 та 46):

<AD08> = 31;
...
<AC07> = 44;
<AC08> = 45;
<AC09> = 46;

тут A — основна частина клавіатури, D та C — ряди (знизу вгору), 07 — номер клавіші. далі шукаю налаштування для кожної клавіші. ось моя j:

key <AD08> {
  type[group1]= "EIGHT_LEVEL_SEMIALPHABETIC",
  type[group2]= "ALPHABETIC",
  symbols[Group1]= [ i, I, Up, Up, rightarrow,  idotless, NoSymbol, NoSymbol ],
  symbols[Group2]= [  Cyrillic_sha, Cyrillic_SHA ]

порівнюючи це з одним рядком виводу xmodmap для клавіші [i] (код 31), здогадуюсь: це мої розкладки (type[groupX]) і відповідний набір псевдонімів (symbols[groupX]). українська для j відформатована за шаблоном "alphabetic", котрий містить (це видно вище у файлі) лише два символи: нормальний та з shift'ом (оті cyrillic_sha та cyrillic_SHA). ось шаблон:

type "ALPHABETIC" {
  modifiers= Shift+Lock;
  map[Shift]= Level2;
  map[Lock]= Level2;
  level_name[Level1]= "Base";
  level_name[Level2]= "Caps";
};

так само [j] має лише два символи в українській розкладці. натомість, клавіші [k] та [l] в українській розкладці відформатовано за іншим шаблоном, в якому визначено чотири символи (і після спроби редагування xmodmap'ом тут вже є потрібні псевдоніми down):

key  {
  type[group1]= "EIGHT_LEVEL_SEMIALPHABETIC",
  type[group2]= "FOUR_LEVEL_ALPHABETIC",
  symbols[Group1]= [ k, K, Down, Down, kra, NoSymbol, NoSymbol, NoSymbol ],
  symbols[Group2]= [ Cyrillic_el, Cyrillic_EL, Down, Down ]

шаблон «four_level_alphabetic»:

type "FOUR_LEVEL_ALPHABETIC" {
  modifiers= Shift+Lock+LevelThree;
  map[Shift]= Level2;
  map[Lock]= Level2;
  map[LevelThree]= Level3;
  map[Shift+LevelThree]= Level4;
  map[Lock+LevelThree]= Level4;
  map[Shift+Lock+LevelThree]= Level3;
  level_name[Level1]= "Base";
  level_name[Level2]= "Shift";
  level_name[Level3]= "Alt Base";
  level_name[Level4]= "Shift Alt";
};

отже, щоби навігація працювала і в українській розкладці, треба «поремонтувати» налаштування клавіш [i] (AD08) та [j] (AC07) — замінити шаблон і додати по два псердоніми:

key <AD08> {
  type[group1]= "EIGHT_LEVEL_SEMIALPHABETIC",
  type[group2]= "FOUR_LEVEL_ALPHABETIC",
  symbols[Group1]= [ i, I, Up, Up, rightarrow, idotless, NoSymbol, NoSymbol ],
  symbols[Group2]= [ Cyrillic_sha, Cyrillic_SHA, Up, Up ]
};
...
key <AC07> {
  type[group1]= "EIGHT_LEVEL_SEMIALPHABETIC",
  type[group2]= "FOUR_LEVEL_ALPHABETIC",
  symbols[Group1]= [ j, J, Left, Left, U0133, U0132, NoSymbol, NoSymbol ],
  symbols[Group2]= [ Cyrillic_o, Cyrillic_O, Left, Left ]
}; 

після цього завантажую налаштування:

xkbcomp layout.xkbcomp $DISPLAY

і навігація capslock+ijkl працює з обома розкладками.

 

проблеми

на жаль, налаштування працюють до перезавантаження, перелогінення, ба навіть перепідключення зовнішньої клавіатури. можливе вирішення —
  • модифіковані розкладки вже з потрібними налаштуваннями (але доведеться щоразу після поновлення системи їх відновлювати, мабуть);
  • або ж якийсь скрипт для вивантаження налаштувань xkbcomp, автоматичного редагування і зворотнього завантаження.
окрім того, треба додати home, end, pgdn, pgup та insert, як це зроблено на pok3r'і. але принаймні це вже зрозуміло як зробити.