Я пытаюсь использовать rust-xcb для получения класса окна задан идентификатор окна.
fn get_class(conn: &xcb::Connection, id: &i32) {
let window: xcb::xproto::Window = *id as u32;
let class_prop: xcb::xproto::Atom = 67; // XCB_ATOM_WM_CLASS from xproto.h
let cookie = xcb::xproto::get_property(&conn, false, window, class_prop, 0, 0, 2);
match cookie.get_reply() {
Ok(reply) => {
let x: &[std::os::raw::c_void] = reply.value();
println!("reply is {:?}", x[0]);
}
Err(err) => println!("err {:?}", err),
}
}
Документация довольно скудная и не очень полезная, хотя я нашел немного о GetPropertyReply
и xcb_get_property_reply_t
переносится.
Я просмотрел этот ответ в JavaScript, но я не знаю, что эквивалентно ctypes
в Ржавчина есть. Я попытался просто преобразовать &[c_void]
в &str
или String
:
...
Ok(reply) => {
let len = reply.value_len() as usize;
let buf = reply.value() as &str;
println!("{}", buf.slice_unchecked(0, len)); // this seems redundant
}
...
но он возвращается
error: non-scalar cast: `&[_]` as `&str`
Я попытался преобразовать &[c_void]
в &[u8]
, а затем собрать Vec
в String
, что вроде работает:
...
Ok(reply) => {
let value : &[u8] = reply.value();
let buf : String = value.into_iter().map(|i| *i as char).collect();
println!("\t{:?}", buf);
}
...
но теперь я получаю странные результаты. например, когда я использую xprop
в Chrome, я вижу "google-chrome", но для меня отображается только "google-c", а "roxterm" отображается как "roxterm\u{0}". Я предполагаю, что "\u{0}" связано с Unicode, но я не уверен, и я также не знаю, почему вещи объединяются. Может, мне еще раз проверить ответ?
String::from_utf8
. - person Peter Hall   schedule 29.06.2017value.bytes_after()
показывает, что действительно есть байты, которые я должен принять, но неясно, как я должен это сделать. повторный вызовcookie.get_reply()
просто зависает. - person erp   schedule 30.06.2017xcb::xproto::get_property()
естьlong_offset
иlong_length
которые можно настроить как надо. - person erp   schedule 30.06.2017