state: Use IM hint and purpose for layout selection
This commit is contained in:
		@ -6,19 +6,21 @@
 | 
			
		||||
 | 
			
		||||
use std::time::Duration;
 | 
			
		||||
 | 
			
		||||
use crate::imservice::ContentPurpose;
 | 
			
		||||
use crate::layout::ArrangementKind;
 | 
			
		||||
use crate::outputs::OutputId;
 | 
			
		||||
use crate::panel::PixelSize;
 | 
			
		||||
use crate::layout::ArrangementKind;
 | 
			
		||||
 | 
			
		||||
/// The keyboard should hide after this has elapsed to prevent flickering.
 | 
			
		||||
pub const HIDING_TIMEOUT: Duration = Duration::from_millis(200);
 | 
			
		||||
 | 
			
		||||
/// Panel contents
 | 
			
		||||
/// Description of parameters which influence panel contents
 | 
			
		||||
#[derive(PartialEq, Clone, Debug)]
 | 
			
		||||
pub struct Contents {
 | 
			
		||||
    pub name: String,
 | 
			
		||||
    pub kind: ArrangementKind,
 | 
			
		||||
    pub overlay_name: Option<String>,
 | 
			
		||||
    pub purpose: ContentPurpose,
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/// The outwardly visible state of visibility
 | 
			
		||||
 | 
			
		||||
@ -305,6 +305,17 @@ fn load_layout_data_with_fallback(
 | 
			
		||||
    panic!("No useful layout found!");
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn load_layout(
 | 
			
		||||
    name: String,
 | 
			
		||||
    kind: ArrangementKind,
 | 
			
		||||
    variant: ContentPurpose,
 | 
			
		||||
    overlay: Option<String>,
 | 
			
		||||
) -> layout::Layout {
 | 
			
		||||
    let overlay = overlay.as_ref().map(String::as_str);
 | 
			
		||||
    let (found_kind, layout)
 | 
			
		||||
        = load_layout_data_with_fallback(&name, kind, variant, overlay);
 | 
			
		||||
    layout::Layout::new(layout, found_kind, variant)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[cfg(test)]
 | 
			
		||||
mod tests {
 | 
			
		||||
 | 
			
		||||
@ -226,7 +226,7 @@ bitflags!{
 | 
			
		||||
/// use rs::imservice::ContentPurpose;
 | 
			
		||||
/// assert_eq!(ContentPurpose::Alpha as u32, 1);
 | 
			
		||||
/// ```
 | 
			
		||||
#[derive(Debug, Copy, Clone)]
 | 
			
		||||
#[derive(Debug, Copy, Clone, PartialEq)]
 | 
			
		||||
pub enum ContentPurpose {
 | 
			
		||||
    Normal = 0,
 | 
			
		||||
    Alpha = 1,
 | 
			
		||||
 | 
			
		||||
@ -19,6 +19,7 @@ mod c {
 | 
			
		||||
    use crate::event_loop::driver;
 | 
			
		||||
    use crate::imservice::IMService;
 | 
			
		||||
    use crate::imservice::c::InputMethod;
 | 
			
		||||
    use crate::layout;
 | 
			
		||||
    use crate::outputs::Outputs;
 | 
			
		||||
    use crate::state;
 | 
			
		||||
    use crate::submission::Submission;
 | 
			
		||||
@ -79,6 +80,8 @@ mod c {
 | 
			
		||||
        #[allow(improper_ctypes)]
 | 
			
		||||
        fn init_wayland(wayland: *mut Wayland);
 | 
			
		||||
        fn eekboard_context_service_set_hint_purpose(service: HintManager, hint: u32, purpose: u32);
 | 
			
		||||
        #[allow(improper_ctypes)]
 | 
			
		||||
        fn eekboard_context_service_set_layout(service: HintManager, layout: *const layout::Layout, timestamp: u32);
 | 
			
		||||
        // This should probably only get called from the gtk main loop,
 | 
			
		||||
        // given that dbus handler is using glib.
 | 
			
		||||
        fn dbus_handler_set_visible(dbus: *const DBusHandler, visible: u8);
 | 
			
		||||
@ -176,6 +179,7 @@ mod c {
 | 
			
		||||
        }
 | 
			
		||||
        
 | 
			
		||||
        if let Some(commands::SetLayout { description }) = msg.layout_selection {
 | 
			
		||||
            //loading::
 | 
			
		||||
            dbg!(description);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -462,6 +462,10 @@ Outcome:
 | 
			
		||||
                            kind: arrangement,
 | 
			
		||||
                            name: layout_name,
 | 
			
		||||
                            overlay_name: overlay,
 | 
			
		||||
                            purpose: match self.im {
 | 
			
		||||
                                InputMethod::Active(InputMethodDetails { purpose, .. }) => purpose,
 | 
			
		||||
                                InputMethod::InactiveSince(_) => ContentPurpose::Normal,
 | 
			
		||||
                            },
 | 
			
		||||
                        }
 | 
			
		||||
                    };
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user