1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
use iup_sys;
use std::ptr;
use std::ffi::CString;
#[derive(Debug, Copy, Clone, Eq, PartialEq)]
pub enum AlarmButton {
Button1,
Button2,
Button3,
}
pub fn alarm<S1, S2>(title: S1, message: S2, button1: String,
button2: Option<String>, button3: Option<String>) -> AlarmButton
where S1: Into<String>, S2: Into<String> {
let ctitle = CString::new(title.into()).unwrap();
let cmessage = CString::new(message.into()).unwrap();
let cbutton1 = CString::new(button1).unwrap();
let cbutton2 = button2.map(|s| CString::new(s).unwrap());
let cbutton3 = button3.map(|s| CString::new(s).unwrap());
let pressed = unsafe {
iup_sys::IupAlarm(ctitle.as_ptr(), cmessage.as_ptr(),
cbutton1.as_ptr(),
cbutton2.map_or(ptr::null(), |cs| cs.as_ptr()),
cbutton3.map_or(ptr::null(), |cs| cs.as_ptr()))
};
match pressed {
1 => AlarmButton::Button1,
2 => AlarmButton::Button2,
3 => AlarmButton::Button3,
_ => unreachable!(),
}
}