gtk/
functions.rs

1// Take a look at the license at the top of the repository in the LICENSE file.
2
3use glib::translate::*;
4use glib::Slice;
5use std::ptr;
6
7#[doc(alias = "gtk_accelerator_parse_with_keycode")]
8pub fn accelerator_parse_with_keycode(
9    accelerator: &str,
10) -> Option<(u32, Slice<u32>, gdk::ModifierType)> {
11    assert_initialized_main_thread!();
12    unsafe {
13        let mut accelerator_key = std::mem::MaybeUninit::uninit();
14        let mut accelerator_codes_ptr = ptr::null_mut();
15        let mut accelerator_mods = std::mem::MaybeUninit::uninit();
16        ffi::gtk_accelerator_parse_with_keycode(
17            accelerator.to_glib_none().0,
18            accelerator_key.as_mut_ptr(),
19            &mut accelerator_codes_ptr,
20            accelerator_mods.as_mut_ptr(),
21        );
22        if !accelerator_codes_ptr.is_null() {
23            let mut len = 0;
24            if !accelerator_codes_ptr.is_null() {
25                while ptr::read(accelerator_codes_ptr.add(len)) != 0 {
26                    len += 1;
27                }
28            }
29            let accelerator_codes = Slice::from_glib_full_num(accelerator_codes_ptr, len);
30            Some((
31                accelerator_key.assume_init(),
32                accelerator_codes,
33                from_glib(accelerator_mods.assume_init()),
34            ))
35        } else {
36            None
37        }
38    }
39}