tabletize — автоповорот екрана для трансформера, наново

| щоденник, комп'ютери, bash, linux, програмування

колись дуже давно (2009) я мав невеличкий нетбук, котрий використовував… як електронну книжку, повертаючи пристрій в портетру орієнтацію й тримаючи, як книжку; мінімально необхідні налаштуваня (поворот екрана, комбінації клавіш) підтримувала читалка fbreader. якщо комусь сьогодні цікаво, чому було не придбати для цього електронну книжку з екраном e-ink — бо ціни кусалися, і я завжди уникав lock-in’ів.

пізніше (2017) я отримав собі в руки ноутбук-трансформер з сенсорним екраном, і не міг не спокуситися ідеєю перетворити і його не читалку… тож почав думати, експериментувати (див. хронологію), і врешті-решт накодував робочий скрипт, який я назвав tabletizer — він вмів визначати орієнтацію ноутбука за даними вбудованого аксерелометра, повертати екран і сенсорну матрицю — фактично, перетворював мій ноутбук на планшет.

навіщо переписувати?

отже, якщо все працювало, навіщо переписувати? все ж таки 13-дюймовий трансформер завеликий і заважкий для казуального читання, тож я продовжував читати художню літературу на мудрофоні. але останнім часом зауважую, що худліт тепер майже виключно слухаю, а читаю — переважно технічну літературу в pdf, і для цього 5-дюймового екрана замало. тож час від часу я подумував або підібрати десь б/у планшет 10” (але це третій пристрій зі собою?), або ризикнути й придбати pinenote (але він ще не готовий, і знову — зайвий пристрій?)…

…аж поки знову повернувся до думки читати на трансформері. проте зі вдосконаленнями:

  • розбити tabletizer на три скрипти, які можна використовувати незалежно:
    • detect_rotation — визначає орієнтацію пристрою за аксерелометром, звітує у форматі, зрозумілому для rotate_desktop;
    • rotate_desktop — повертає стільницю x11 і відповідно трансформує матрицю вводу тактильних пристроїв;
    • tabletize — інтелектуально повертає екран залежно від орієнтації пристрою, якщо відкрито одну з програм для читання;
  • зробити код надійнішим:
    • деякі фрагменти були дуже «тимчасові» (особливо позичений скрипт для повороту, були проблеми з детектуванням екрана);
    • перевірка й звітування про залежності (wmctrl, xdotool, xinput тощо);
  • додати параметрів, надійніші значення по замовчуванню:
    • детальний --help для всіх трьох утиліт;
    • detect_rotation --debug показує кути акселерометра;
    • rotate_desktop без аргументів повертає екран в нормальну орієнтацію, додаткові аргументи для примусового вибору екрана (в обхід автовизначення) і тактильних пристроїв.

п’ять секунд

просидів вихідний, дописав чорнову версію, тестую… перевіряю окремі компоненти — все гаразд:

detect_rotation | xargs rotate_desktop

але поєдную все tabletize‘ом — не працює: як не кручу ноутбуком, а воно звітує про нормальну орієнтацію, і хай йому грець:

tabletize --cont 5 &

мучився довго, додавав і прибирав тестовий код, виводив усе, що можна… плюнув, пішов спати.

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

  • watch detect_rotation — за замовчуванням watch чекає 2 секунди, все працює;
  • watch -n 5 detect_rotation — інтервал 5 секунд — акселерометр «залипає» на нормальній орієнтації!

поняття не маю, що відбувається. можливо, iio дозволяє акселерометру «заснути», якщо немає опитувань упродовж певного часу, і 4-5 секунд — якраз той мінімальний інтервал?

простіше — значить краще

написавши й відладивши detect_rotation, rotate_desktop та трохи програвшись із чорновою версією tabletazer’а, зрозумів, що…

  • wmctrl і xdotool досить обмежені в тому, що можна зробити з вікнами;
  • складніша логіка потребує досить великого коду, щоби бути надійною;
  • оригінальна ідея (розгортання на ввесь екран) починає конфліктувати моєю стільницею (тайлинг з krohnkite);
  • надто «розумна» програма oбмежує і починає дратувати =(

гадаю, що для зручного читання pdf’ів у портретній орієнтації мені достатньо буде чогось простого:

  • детектувати зміну орієнтації екрана, і то «ліниво» (лише на великі кути, дуже близькі до портрету);
  • при повороті в потрет — повернути зображення, і якщо активне вікно в переліку «читалок» — мінімізувати всі інші вікна (krohnkite сам розгорне активне на ввесь екран);
  • при поверненні в ландшафт — повернути зображення і не чіпати вікна.

більше нічого не треба. тож час «порізати» все зайве й спростити фінальний скрипт практично до того, з чого я починав =) ну, як сказав колись джеф сікел, «deleted code is debugged code».

далі буде…

випроба прототипу tabletize

хронологія