# Maliit lib-rs
## Описание
Эта библиотека это что-то типа maliit-glib но написана на Rust и имеет меньше возможностей.
> [!WARNING]
> Возможны баги и краши, т.к. интерфейс фреймворка maliit описан очень плохо, из-за чего разработка велась наощупь.
> [!NOTE]
> Разработка велась под ОС Аврора, работоспособность в десктопных окружениях linux не гарантируется.
## Возможности
- [x] Вызов экранной клавиатуры
- [x] Сокрытие экранной клавиатуры
- [x] Получение событий нажатия на клавиши экранной клавиатуры
- [x] Сброс состояния ввода
- [x] Установка языка клавиатуры
- [ ] Отправка текста для подсказок с клавиатуры
## Использование
```rust
use maliit::{InputMethod, MaliitError};
fn main() -> Result<(), MaliitError> {
let mut im = InputMethod::new()?;
// Регистрация обработчика событий (запускает фоновый поток)
im.add_event_handler(|event| {
println!("Событие: {:?}", event);
})?;
// Установка языка перед показом клавиатуры
im.set_language("ru")?;
// Показать клавиатуру
im.show()?;
// ... работа с клавиатурой ...
// Скрыть клавиатуру
im.hide()?;
// Остановить обработчики и завершить фоновый поток
im.clear_event_handlers();
Ok(())
}
```
## API
Все публичные методы `InputMethod` возвращают `Result<..., MaliitError>`.
### Основные методы
| `InputMethod::new()` | Подключение к Maliit серверу по D-Bus |
| `show()` | Показать экранную клавиатуру |
| `hide()` | Скрыть экранную клавиатуру |
| `reset()` | Сбросить состояние ввода |
| `set_language(lang)` | Установить язык клавиатуры |
| `rotate(orientation)` | Повернуть клавиатуру (`Orientation::Portrait` / `Landscape` / `PortraitFlipped` / `LandscapeFlipped`) |
| `update_widget_information(info, focus_changed)` | Обновить состояние текстового виджета на сервере Maliit |
| `show_with_info(info)` | Показать клавиатуру, предварительно отправив состояние виджета |
### Обработка событий
События обрабатываются в фоновом потоке. Каждый зарегистрированный обработчик
вызывается для каждого события.
```rust
// Добавить обработчик (первый вызов запускает фоновый поток)
InputMethodEvent::Text(text) => { /* текст введён */ }
InputMethodEvent::Key { key, pressed } => { /* нажата клавиша */ }
InputMethodEvent::AreaChanged(x, y, w, h) => { /* изменилась область клавиатуры */ }
InputMethodEvent::ImInitiatedHide => { /* пользователь нажал кнопку скрытия клавиатуры */ }
InputMethodEvent::ActivationLost => { /* контекст потерял активацию */ }
}
})?;
// Можно добавить несколько обработчиков
})?;
// Остановить все обработчики и завершить поток
im.clear_event_handlers();
```
## Ошибки
Все ошибки представлены типом `MaliitError`:
```rust
pub enum MaliitError {
Dbus(dbus::Error),
NotAvailable,
}
```