колись дуже давно (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».
далі буде…