fcitx5-dbus

Crates.iofcitx5-dbus
lib.rsfcitx5-dbus
version
sourcesrc
created_at2024-12-08 04:52:35.962555+00
updated_at2024-12-14 18:40:47.253631+00
descriptionfcitx5 dbus interface for rust
homepagehttps://github.com/jedsek/fcitx5-dbus
repositoryhttps://github.com/jedsek/fcitx5-dbus
max_upload_size
id1476051
Cargo.toml error:TOML parse error at line 18, column 1 | 18 | autolib = false | ^^^^^^^ unknown field `autolib`, expected one of `name`, `version`, `edition`, `authors`, `description`, `readme`, `license`, `repository`, `homepage`, `documentation`, `build`, `resolver`, `links`, `default-run`, `default_dash_run`, `rust-version`, `rust_dash_version`, `rust_version`, `license-file`, `license_dash_file`, `license_file`, `licenseFile`, `license_capital_file`, `forced-target`, `forced_dash_target`, `autobins`, `autotests`, `autoexamples`, `autobenches`, `publish`, `metadata`, `keywords`, `categories`, `exclude`, `include`
size0
Jedsek (Jedsek)

documentation

https://docs.rs/fcitx5-dbus/latest/fcitx5-dbus/

README

fcitx5-dbus

Introduce

This crate provides high-level fcitx5 dbus bindings for rust code.
You could use this crate to develop somthing, like IME plugins in editors(vim/emacs).

(The document is coming soon...)

  • architecture
src
├── controller.rs
├── input_context.rs
├── input_method.rs
├── lib.rs
├── utils
│   ├── capability_flags.rs
│   ├── key_event.rs
│   ├── macros.rs
│   ├── mod.rs
│   └── rect.rs
└── virtual_keyboard.rs

Usage

// Cargo.toml
//
// [dependencies]
// fcitx5-dbus = "0.1.2"

use fcitx5_dbus::utils::CapabilityFlag;
use fcitx5_dbus::zbus::{blocking::Connection, Result};
use fcitx5_dbus::{
    controller::ControllerProxyBlocking, input_context::InputContextProxyBlocking,
    input_method::InputMethodProxyBlocking,
};
use std::thread;
use std::time::Duration;

type Ctx<'a> = InputContextProxyBlocking<'a>;

fn main() -> Result<()> {
    let ctx = prepare()?;

    thread::scope(|s| {
        s.spawn(|| input(&ctx));
        s.spawn(|| receive(&ctx));
    });

    Ok(())
}

fn prepare() -> Result<Ctx<'static>> {
    let conn = Connection::session()?;
    let controller = ControllerProxyBlocking::new(&conn)?;
    let input_method = InputMethodProxyBlocking::new(&conn)?;

    let (p, _) = input_method.create_input_context(&[("program", "zellij-my")])?;
    println!("Path is : {}\n", p);

    let ctx = InputContextProxyBlocking::builder(&conn).path(p)?.build()?;
    ctx.set_capability(CapabilityFlag::ClientSideInputPanel)?;
    ctx.focus_in()?;
    controller.toggle()?;

    Ok(ctx)
}

fn input(ctx: &Ctx) -> Result<()> {
    loop {
        wrapper::send_key(ctx, 'a')?;
        thread::sleep(Duration::from_secs(1));
    }
}

fn receive(ctx: &Ctx) -> Result<()> {
    let update_infos = ctx.receive_update_client_side_ui()?;
    for info in update_infos {
        let info = info.args()?;
        println!("{:?}\n", info);
    }
    Ok(())
}

pub(crate) mod wrapper {
    use crate::Ctx;
    use fcitx5_dbus::{utils::key_event, zbus::Result};

    pub(crate) fn send_key(ctx: &Ctx, chr: char) -> Result<()> {
        // let code = fcitx5_dbus::utils::key_event::KeyVal::CHAR_A;
        let code = key_event::KeyVal::from_char(chr);
        let state = key_event::KeyState::NoState;
        ctx.process_key_event(code, 0, state, false, 0)?;
        Ok(())
    }
}
Commit count: 6

cargo fmt