Skip to main content

reaper_medium/
gaccel_register.rs

1use crate::{CommandId, ReaperStringArg};
2use reaper_low::raw;
3use reaper_low::raw::gaccel_register_t;
4use std::borrow::Cow;
5use std::ffi::CStr;
6use std::os::raw::c_ushort;
7
8/// A kind of action descriptor.
9///
10/// Contains action description, command ID and default key binding.
11//
12// Case 2: Internals exposed: yes | vtable: no
13// ===========================================
14#[derive(Clone, Eq, PartialEq, Hash, Debug)]
15pub struct MediumGaccelRegister {
16    owned_desc: Cow<'static, CStr>,
17    inner: gaccel_register_t,
18}
19
20impl MediumGaccelRegister {
21    /// Creates an action descriptor without key binding.
22    pub fn without_key_binding(
23        cmd: CommandId,
24        desc: impl Into<ReaperStringArg<'static>>,
25    ) -> MediumGaccelRegister {
26        let desc = desc.into().into_inner();
27        let desc_ptr = desc.as_ptr();
28        MediumGaccelRegister {
29            owned_desc: desc,
30            inner: raw::gaccel_register_t {
31                accel: raw::ACCEL {
32                    fVirt: 0,
33                    key: 0,
34                    // TODO-low Why are REAPER command IDs u32? They need to fit into a u16 here!
35                    cmd: cmd.get() as c_ushort,
36                },
37                desc: desc_ptr,
38            },
39        }
40    }
41}
42
43impl AsRef<raw::gaccel_register_t> for MediumGaccelRegister {
44    fn as_ref(&self) -> &gaccel_register_t {
45        &self.inner
46    }
47}