submission.rs 2.96 KB
Newer Older
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/*! Managing the state of text input in the application.
 * 
 * This is a library module.
 * 
 * It needs to combine text-input and virtual-keyboard protocols
 * to achieve a consistent view of the text-input state,
 * and to submit exactly what the user wanted.
 * 
 * It must also not get tripped up by sudden disappearances of interfaces.
 * 
 * The virtual-keyboard interface is always present.
 * 
 * The text-input interface may not be presented,
 * and, for simplicity, no further attempt to claim it is made.
 * 
 * The text-input interface may be enabled and disabled at arbitrary times,
 * and those events SHOULD NOT cause any lost events.
 * */
19

20
21
22
use ::imservice::IMService;
//use ::vkeyboard::VirtualKeyboard;

23
24
25
/// Temporary reexport to keep stuff based directly on virtual-keyboard working
/// until a unified handler appears and prompts a rework.
pub use vkeyboard::*;
26
27
28
29
30
31
32
33

/// Gathers stuff defined in C or called by C
pub mod c {
    use super::*;
    
    use std::os::raw::c_void;

    use ::imservice::c::InputMethod;
34
35
    use ::layout::c::LevelKeyboard;
    use ::vkeyboard::c::ZwpVirtualKeyboardV1;
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50

    // The following defined in C

    /// ServerContextService*
    #[repr(transparent)]
    pub struct UIManager(*const c_void);

    /// EekboardContextService*
    #[repr(transparent)]
    pub struct StateManager(*const c_void);

    #[no_mangle]
    pub extern "C"
    fn submission_new(
        im: *mut InputMethod,
51
        vk: ZwpVirtualKeyboardV1,
52
53
54
55
56
57
58
59
60
61
62
        state_manager: *const StateManager
    ) -> *mut Submission {
        let imservice = if im.is_null() {
            None
        } else {
            Some(IMService::new(im, state_manager))
        };
        // TODO: add vkeyboard too
        Box::<Submission>::into_raw(Box::new(
            Submission {
                imservice,
63
                virtual_keyboard: VirtualKeyboard(vk),
64
65
66
67
            }
        ))
    }

68
    /// Use to initialize the UI reference
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
    #[no_mangle]
    pub extern "C"
    fn submission_set_ui(submission: *mut Submission, ui_manager: *const UIManager) {
        if submission.is_null() {
            panic!("Null submission pointer");
        }
        let submission: &mut Submission = unsafe { &mut *submission };
        if let Some(ref mut imservice) = &mut submission.imservice {
            imservice.ui_manager = if ui_manager.is_null() {
                None
            } else {
                Some(ui_manager)
            }
        };
    }
84
85
86
87
88
89
90
91
92
93

    #[no_mangle]
    pub extern "C"
    fn submission_set_keyboard(submission: *mut Submission, keyboard: LevelKeyboard) {
        if submission.is_null() {
            panic!("Null submission pointer");
        }
        let submission: &mut Submission = unsafe { &mut *submission };
        submission.virtual_keyboard.update_keymap(keyboard);
    }
94
95
96
97
98
99
}

pub struct Submission {
    // used by C callbacks internally, TODO: make use with virtual keyboard
    #[allow(dead_code)]
    imservice: Option<Box<IMService>>,
100
    pub virtual_keyboard: VirtualKeyboard,
101
}