2021-09-21 21:45:07 +02:00
Unl0kr
2021-09-02 21:17:56 +02:00
======
2021-09-21 13:44:42 +02:00
Framebuffer-based disk unlocker for the initramfs based on [LVGL].
2021-09-02 21:17:56 +02:00
2021-09-21 13:44:42 +02:00
[[_TOC_]]
2021-09-02 21:17:56 +02:00
# About
2021-09-21 21:45:07 +02:00
Unl0kr is an [osk-sdl] clone written in [LVGL] and rendering directly to the Linux framebuffer. As a result, it doesn't depend on GPU hardware acceleration.
2021-09-21 13:44:42 +02:00
2021-09-21 13:47:08 +02:00
For some background on how unl0kr came to be, see postmarketOS/osk-sdl#121 .
2021-09-02 21:17:56 +02:00
# Status
2021-09-21 14:56:14 +02:00
We are en route to v1 which aims at providing a useable, visually pleasant application including [osk-sdl]'s most essential features. For details about the current status, see the [v1 milestone]. You may also browse the full list of [open issues] to get an idea of what's planned beyond v1.
2021-09-02 21:17:56 +02:00
2021-09-21 13:44:42 +02:00
Here are a few highlights of what already works:
2021-09-02 21:17:56 +02:00
- Password-entry UI including on-screen keyboard on the framebuffer
2021-09-21 13:44:42 +02:00
- Input device discovery for keyboards, mice, trackpads and touch screens
- On-screen keyboard control via:
- One or more mice / trackpads (including cursor)
- One or more hardware keyboards (including support for different layouts using XKB)
- Touchscreen (tested on PinePhone)
- Switching on-screen keyboard layout at runtime (currently supported layouts: de, es, fr, us)
- Toggling on-screen keyboard with slide in/out animation
2021-09-06 11:42:00 +02:00
- Switching between light and dark theme at runtime
2021-09-06 13:02:24 +02:00
- Disclosing and hiding entered password at runtime
2021-09-21 13:44:42 +02:00
- Shutting down the device via a soft button
2021-09-09 17:32:47 +02:00
2021-09-21 21:56:48 +02:00
For a growing collection of demo videos, see the [wiki].
2021-09-21 13:44:42 +02:00
## Upstreaming
2021-09-02 21:17:56 +02:00
2021-09-21 21:40:25 +02:00
Over the course of implementing unl0kr, suitable fixes and features have been upstreamed to the [lvgl] and [lv_drivers] repositories. The benefit of this goes both ways. Downstream we can rely on the features being maintained in the future and upstream they can make the features available to the larger audience of [LVGL] users.
2021-09-02 21:17:56 +02:00
2021-09-21 13:44:42 +02:00
Below is a summary of contributions upstreamed thus far.
2021-09-02 21:17:56 +02:00
2021-09-21 13:44:42 +02:00
### lvgl
2021-09-08 10:27:51 +02:00
- [fix(examples) don't compile assets unless needed] (✅ merged)
- [feat(btnmatrix): add option to show popovers on button press] (⏳ in review)
2021-09-09 16:56:21 +02:00
- [feat(msgbox): add function to get selected button index] (✅ merged)
- [feat(msgbox): omit title label unless needed] (✅ merged)
2021-09-22 12:33:06 +02:00
- [fix(btnmatrix): make ORed values work correctly with lv_btnmatrix_has_btn_ctrl] (✅ merged)
2021-09-08 10:27:51 +02:00
2021-09-21 13:44:42 +02:00
### lv_drivers
2021-09-08 10:27:51 +02:00
2021-09-05 20:31:16 +02:00
- [Add support for pointer devices to libinput driver] (✅ merged)
2021-09-03 21:06:19 +02:00
- [Add support for keypads to libinput driver] (✅ merged)
2021-09-15 21:08:10 +02:00
- [Add full keyboard support to libinput/evdev driver] (✅ merged)
2021-09-09 14:08:19 +02:00
- [Automatic device discovery via libinput] (✅ merged)
2021-09-18 13:56:40 +02:00
- [Make it possible to use multiple devices with the libinput and XKB drivers] (⏳ in review)
2021-09-02 21:17:56 +02:00
2021-09-06 10:26:59 +02:00
# Development
2021-09-02 21:17:56 +02:00
## Dependencies
- [lvgl] (git submodule / linked statically)
- [lv_drivers] (git submodule / linked statically)
2021-09-21 13:44:42 +02:00
- [squeek2lvgl] (git submodule / linked statically)
2021-09-02 21:17:56 +02:00
- [libinput]
2021-09-05 20:28:25 +02:00
- [libxkbcommon]
2021-09-21 21:40:25 +02:00
- evdev kernel module
2021-09-02 21:17:56 +02:00
2021-09-06 10:26:59 +02:00
## Building & running
2021-09-02 21:17:56 +02:00
2021-09-21 13:44:42 +02:00
For development and testing you can run the app in a VT. Unless your user account has special privileges, `sudo` will be needed to access input device files.
2021-09-02 21:17:56 +02:00
```
2021-09-22 18:06:13 +00:00
$ meson _build
2021-09-23 14:52:36 +02:00
$ meson compile -C _build
2021-09-02 21:17:56 +02:00
$ sudo chvt 2
2021-09-22 18:06:13 +00:00
$ sudo ./_build/unl0kr
2021-09-02 21:17:56 +02:00
```
2021-09-23 14:52:36 +02:00
With meson < 0 \.55 use `ninja` instead of `meson compile` \.
2021-09-21 13:44:42 +02:00
## Fonts
2021-09-06 10:26:59 +02:00
2021-09-21 21:45:07 +02:00
In order to work with [LVGL], fonts need to be converted to bitmaps, stored as C arrays. Unl0kr currently uses a combination of the [Montserrat] font for text and the [FontAwesome] font for pictograms. For both fonts only limited character ranges are included to reduce the binary size. To (re)generate the C file containing the combined font, run the following command
2021-09-08 12:22:10 +02:00
```
$ npx lv_font_conv --bpp 4 --size 32 --no-compress -o montserrat_extended_32.c --format lvgl \
--font Montserrat-Regular.ttf \
--range '0x0020-0x007F' \
--range '0x00A0-0x00FF' \
2021-09-08 22:19:45 +02:00
--range '0x0100-0x017F' \
2021-09-09 08:42:14 +02:00
--range '0x2000-0x206F' \
--range '0x20A0-0x20CF' \
2021-09-08 12:22:10 +02:00
--font FontAwesome5-Solid+Brands+Regular.woff \
--range '0xF001,0xF008,0xF00B,0xF00C,0xF00D,0xF011,0xF013,0xF015,0xF019,0xF01C,0xF021,0xF026,0xF027,0xF028,0xF03E,0xF0E0,0xF304,0xF043,0xF048,0xF04B,0xF04C,0xF04D,0xF051,0xF052,0xF053,0xF054,0xF067,0xF068,0xF06E,0xF070,0xF071,0xF074,0xF077,0xF078,0xF079,0xF07B,0xF093,0xF095,0xF0C4,0xF0C5,0xF0C7,0xF0C9,0xF0E7,0xF0EA,0xF0F3,0xF11C,0xF124,0xF158,0xF1EB,0xF240,0xF241,0xF242,0xF243,0xF244,0xF287,0xF293,0xF2ED,0xF55A,0xF7C2,0xF8A2' \
2021-09-20 13:05:12 +02:00
--range '0xF042' \
--range '0xF35B'
2021-09-08 12:22:10 +02:00
```
2021-09-21 13:44:42 +02:00
Below is a short explanation of the different unicode ranges used above.
2021-09-20 13:05:12 +02:00
- [Montserrat]
- Basic Latin (`0x0020-0x007F` )
- Latin-1 supplement (`0x00A0-0x00FF` )
- Latin extended A (`0x0100-0x017F` )
- General punctuation (`0x2000-0x206F` )
- Currency symbols (`0x20A0-0x20CF` )
- [FontAwesome]
- Standard `LV_SYMBOL_*` glyphs (`0xF001,0xF008,0xF00B,0xF00C,0xF00D,0xF011,0xF013,0xF015,0xF019,0xF01C,0xF021,0xF026,0xF027,0xF028,0xF03E,0xF0E0,0xF304,0xF043,0xF048,0xF04B,0xF04C,0xF04D,0xF051,0xF052,0xF053,0xF054,0xF067,0xF068,0xF06E,0xF070,0xF071,0xF074,0xF077,0xF078,0xF079,0xF07B,0xF093,0xF095,0xF0C4,0xF0C5,0xF0C7,0xF0C9,0xF0E7,0xF0EA,0xF0F3,0xF11C,0xF124,0xF158,0xF1EB,0xF240,0xF241,0xF242,0xF243,0xF244,0xF287,0xF293,0xF2ED,0xF55A,0xF7C2,0xF8A2` )
- [adjust] (`0xF042` )
- [arrow-alt-circle-up] (`0xF35B` )
2021-09-21 13:44:42 +02:00
## Keyboard layouts
2021-09-09 09:32:59 +02:00
2021-09-21 21:45:07 +02:00
Unl0kr uses [squeekboard layouts] converted to C via [squeek2lvgl]. To regenerate the layouts, run
2021-09-09 09:32:59 +02:00
```
2021-09-19 13:35:53 +02:00
$ ./regenerate-layouts.sh
2021-09-09 09:32:59 +02:00
```
2021-09-19 13:35:53 +02:00
from the root of the repository.
2021-09-09 09:32:59 +02:00
## Screen recording
For demonstration purposes you can record the framebuffer device, e.g. with ffmpeg:
```
$ sudo ffmpeg -f fbdev -i /dev/fb0 -r 24 -c:v libx264 -b:v 500k demo.avi
```
2021-09-02 21:17:56 +02:00
# Acknowledgements
2021-09-21 21:40:25 +02:00
The [lv_port_linux_frame_buffer] project served as a starting point for the codebase.
The mouse cursor image was taken from [lv_sim_emscripten].
2021-09-02 21:17:56 +02:00
# License
2021-09-21 21:45:07 +02:00
Unl0kr is licensed under the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
2021-09-02 21:17:56 +02:00
2021-09-21 13:50:20 +02:00
The [Montserrat] font is licensed under the Open Font License.
2021-09-08 12:22:10 +02:00
2021-09-21 13:50:20 +02:00
The [FontAwesome] font is licensed under the Open Font License version 1.1.
2021-09-08 12:22:10 +02:00
2021-09-21 13:44:42 +02:00
[Add full keyboard support to libinput/evdev driver]: https://github.com/lvgl/lv_drivers/pull/156
[Add support for keypads to libinput driver]: https://github.com/lvgl/lv_drivers/pull/152
[Add support for pointer devices to libinput driver]: https://github.com/lvgl/lv_drivers/pull/150
[Automatic device discovery via libinput]: https://github.com/lvgl/lv_drivers/pull/157
2021-09-21 13:50:20 +02:00
[FontAwesome]: https://fontawesome.com
2021-09-21 13:44:42 +02:00
[LVGL]: https://lvgl.io
[Make it possible to use multiple devices with the libinput and XKB drivers]: https://github.com/lvgl/lv_drivers/pull/165
2021-09-21 13:50:20 +02:00
[Montserrat]: https://fonts.google.com/specimen/Montserrat
2021-09-06 11:42:00 +02:00
[adjust]: https://fontawesome.com/v5.15/icons/adjust?style=solid
2021-09-20 13:05:12 +02:00
[arrow-alt-circle-up]: https://fontawesome.com/v5.15/icons/arrow-alt-circle-up?style=solid
2021-09-08 10:27:51 +02:00
[feat(btnmatrix): add option to show popovers on button press]: https://github.com/lvgl/lvgl/pull/2537
[feat(msgbox): add function to get selected button index]: https://github.com/lvgl/lvgl/pull/2538
[feat(msgbox): omit title label unless needed]: https://github.com/lvgl/lvgl/pull/2539
2021-09-20 10:13:45 +02:00
[fix(btnmatrix): make ORed values work correctly with lv_btnmatrix_has_btn_ctrl]: https://github.com/lvgl/lvgl/pull/2571
2021-09-21 13:44:42 +02:00
[fix(examples) don't compile assets unless needed]: https://github.com/lvgl/lvgl/pull/2523
[libinput]: https://gitlab.freedesktop.org/libinput/libinput
[libxkbcommon]: https://github.com/xkbcommon/libxkbcommon
[lv_drivers]: https://github.com/lvgl/lv_drivers
[lv_port_linux_frame_buffer]: https://github.com/lvgl/lv_port_linux_frame_buffer
[lv_sim_emscripten]: https://github.com/lvgl/lv_sim_emscripten/blob/master/mouse_cursor_icon.c
[lvgl]: https://github.com/lvgl/lvgl
[online font converter]: https://lvgl.io/tools/fontconverter
[open issues]: https://gitlab.com/cherrypicker/unl0kr/-/issues
[osk-sdl]: https://gitlab.com/postmarketOS/osk-sdl
[squeek2lvgl]: https://gitlab.com/cherrypicker/squeek2lvgl
[squeekboard layouts]: https://gitlab.gnome.org/World/Phosh/squeekboard/-/tree/master/data/keyboards
[v1 milestone]: https://gitlab.com/cherrypicker/unl0kr/-/milestones/1
2021-09-21 21:56:48 +02:00
[wiki]: https://gitlab.com/cherrypicker/unl0kr/-/wikis/home