maliit 0.2.0

Maliit framework client library
Documentation
# 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
// Добавить обработчик (первый вызов запускает фоновый поток)
im.add_event_handler(|event| {
    match event {
        InputMethodEvent::Text(text) => { /* текст введён */ }
        InputMethodEvent::Key { key, pressed } => { /* нажата клавиша */ }
        InputMethodEvent::AreaChanged(x, y, w, h) => { /* изменилась область клавиатуры */ }
        InputMethodEvent::ImInitiatedHide => { /* пользователь нажал кнопку скрытия клавиатуры */ }
        InputMethodEvent::ActivationLost => { /* контекст потерял активацию */ }
    }
})?;

// Можно добавить несколько обработчиков
im.add_event_handler(|event| {
    log::debug!("Second handler: {:?}", event);
})?;

// Остановить все обработчики и завершить поток
im.clear_event_handlers();
```

## Ошибки

Все ошибки представлены типом `MaliitError`:

```rust
pub enum MaliitError {
    Dbus(dbus::Error),
    NotAvailable,
}
```