From 8d0e1b454812666dea94047984633ef28fceb7f4 Mon Sep 17 00:00:00 2001 From: Dorota Czaplejewicz Date: Fri, 3 Jun 2022 13:35:04 +0000 Subject: [PATCH] state: Use IM hint and purpose for layout selection --- eekboard/eekboard-context-service.c | 6 ++++++ src/animation.rs | 6 ++++-- src/data/loading.rs | 11 +++++++++++ src/imservice.rs | 2 +- src/main.rs | 4 ++++ src/state.rs | 4 ++++ 6 files changed, 30 insertions(+), 3 deletions(-) diff --git a/eekboard/eekboard-context-service.c b/eekboard/eekboard-context-service.c index 5ad80771..b06d9b75 100644 --- a/eekboard/eekboard-context-service.c +++ b/eekboard/eekboard-context-service.c @@ -128,6 +128,8 @@ settings_get_layout(GSettings *settings, char **type, char **layout) g_variant_unref(inputs); } +void eekboard_context_service_set_layout(EekboardContextService *context, struct squeek_layout *layout, uint32_t timestamp); + void eekboard_context_service_use_layout(EekboardContextService *context, struct squeek_layout_state *state, uint32_t timestamp) { gchar *layout_name = state->layout_name; @@ -146,6 +148,10 @@ eekboard_context_service_use_layout(EekboardContextService *context, struct sque // generic part follows struct squeek_layout *layout = squeek_load_layout(layout_name, state->arrangement, state->purpose, overlay_name); + eekboard_context_service_set_layout(context, layout, timestamp); +} + +void eekboard_context_service_set_layout(EekboardContextService *context, struct squeek_layout *layout, uint32_t timestamp) { LevelKeyboard *keyboard = level_keyboard_new(layout); // set as current LevelKeyboard *previous_keyboard = context->keyboard; diff --git a/src/animation.rs b/src/animation.rs index b6e6c060..f1c53fd0 100644 --- a/src/animation.rs +++ b/src/animation.rs @@ -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, + pub purpose: ContentPurpose, } /// The outwardly visible state of visibility diff --git a/src/data/loading.rs b/src/data/loading.rs index 63e372ba..2b173cd9 100644 --- a/src/data/loading.rs +++ b/src/data/loading.rs @@ -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, +) -> 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 { diff --git a/src/imservice.rs b/src/imservice.rs index 14cbca16..3c52a7e7 100644 --- a/src/imservice.rs +++ b/src/imservice.rs @@ -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, diff --git a/src/main.rs b/src/main.rs index 7967de8e..ff12a96a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -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); } } diff --git a/src/state.rs b/src/state.rs index 5c6d7431..0fd5b6a5 100644 --- a/src/state.rs +++ b/src/state.rs @@ -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, + }, } };