diff --git a/data/common.css b/data/common.css index aeeba604..596f664d 100644 --- a/data/common.css +++ b/data/common.css @@ -5,6 +5,11 @@ sq_view { font-size: 1.5em; } +sq_view.gr_polytonic { + font-family: cantarell, sans-serif; + font-size: 5em; +} + sq_button { border-radius: 4px; margin: 2px; diff --git a/debian/control b/debian/control index e000afb6..5c40771d 100644 --- a/debian/control +++ b/debian/control @@ -8,6 +8,7 @@ Build-Depends: meson (>=0.51.0), ninja-build, pkg-config, + libbsd-dev, libglib2.0-dev, libgnome-desktop-3-dev, libgtk-3-dev, diff --git a/debian/control-newer b/debian/control-newer index a9480941..177a7a94 100644 --- a/debian/control-newer +++ b/debian/control-newer @@ -8,6 +8,7 @@ Build-Depends: meson (>=0.51.0), ninja-build, pkg-config, + libbsd-dev, libglib2.0-dev, libgnome-desktop-3-dev, libgtk-3-dev, diff --git a/eek/eek-keyboard.c b/eek/eek-keyboard.c index a7e97357..189098a9 100644 --- a/eek/eek-keyboard.c +++ b/eek/eek-keyboard.c @@ -21,6 +21,7 @@ #include "config.h" #define _XOPEN_SOURCE 500 +#include #include #include #include @@ -91,12 +92,13 @@ void level_keyboard_free(LevelKeyboard *self) { } LevelKeyboard* -level_keyboard_new (struct squeek_layout *layout) +level_keyboard_new (char *style_name, struct squeek_layout *layout) { LevelKeyboard *keyboard = g_new0(LevelKeyboard, 1); if (!keyboard) { g_error("Failed to create a keyboard"); } keyboard->layout = layout; + strlcpy(keyboard->style_name, style_name, 19); return keyboard; } diff --git a/eek/eek-keyboard.h b/eek/eek-keyboard.h index be13b0b9..afe4a019 100644 --- a/eek/eek-keyboard.h +++ b/eek/eek-keyboard.h @@ -38,17 +38,17 @@ struct keymap { size_t fd_len; // length of the data inside keymap_fd }; -/// Keyboard state holder +/// Keyboard info holder struct _LevelKeyboard { + char style_name[20]; // The name of the css class on layout struct squeek_layout *layout; // owned -// FIXME: This no longer needs to exist, keymap was folded into layout. }; typedef struct _LevelKeyboard LevelKeyboard; gchar *eek_keyboard_get_keymap(LevelKeyboard *keyboard); LevelKeyboard* -level_keyboard_new (struct squeek_layout *layout); +level_keyboard_new (char *style_name, struct squeek_layout *layout); void level_keyboard_free(LevelKeyboard *self); G_END_DECLS diff --git a/eek/eek-renderer.c b/eek/eek-renderer.c index fabf679a..ed8107b1 100644 --- a/eek/eek-renderer.c +++ b/eek/eek-renderer.c @@ -335,6 +335,7 @@ eek_renderer_new (LevelKeyboard *keyboard, if (squeek_layout_get_kind(keyboard->layout) == ARRANGEMENT_KIND_WIDE) { gtk_style_context_add_class(renderer->view_context, "wide"); } + gtk_style_context_add_class(renderer->view_context, (char*)&keyboard->style_name); gtk_style_context_add_provider (renderer->view_context, GTK_STYLE_PROVIDER(renderer->css_provider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); diff --git a/eekboard/eekboard-context-service.c b/eekboard/eekboard-context-service.c index 92114a4e..dbb0ca6a 100644 --- a/eekboard/eekboard-context-service.c +++ b/eekboard/eekboard-context-service.c @@ -126,8 +126,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) { - LevelKeyboard *keyboard = level_keyboard_new(layout); +void eekboard_context_service_set_layout(EekboardContextService *context, char *style_name, struct squeek_layout *layout, uint32_t timestamp) { + LevelKeyboard *keyboard = level_keyboard_new(style_name, layout); // set as current LevelKeyboard *previous_keyboard = context->keyboard; context->keyboard = keyboard; diff --git a/src/data/loading.rs b/src/data/loading.rs index a00acae4..b173477a 100644 --- a/src/data/loading.rs +++ b/src/data/loading.rs @@ -253,14 +253,14 @@ fn load_layout_data_with_fallback( } pub fn load_layout( - name: String, + name: &String, kind: ArrangementKind, variant: ContentPurpose, - overlay: Option, + 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); + = load_layout_data_with_fallback(name, kind, variant, overlay); layout::Layout::new(layout, found_kind, variant) } diff --git a/src/main.rs b/src/main.rs index 13c1766c..261cd6e9 100644 --- a/src/main.rs +++ b/src/main.rs @@ -13,7 +13,8 @@ use glib::{Continue, MainContext, PRIORITY_DEFAULT, Receiver}; mod c { use super::*; - use std::os::raw::c_void; + use std::ffi::CString; + use std::os::raw::{c_char, c_void}; use std::ptr; use std::rc::Rc; use std::time::Instant; @@ -83,7 +84,7 @@ mod c { #[allow(improper_ctypes)] fn init_wayland(wayland: *mut Wayland); #[allow(improper_ctypes)] - fn eekboard_context_service_set_layout(service: HintManager, layout: *const layout::Layout, timestamp: u32); + fn eekboard_context_service_set_layout(service: HintManager, name: *const c_char, 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); @@ -187,10 +188,17 @@ mod c { purpose, } = description; actors::popover::set_overlay(popover, overlay_name.clone()); - let layout = loading::load_layout(name, kind, purpose, overlay_name); + let layout = loading::load_layout(&name, kind, purpose, &overlay_name); let layout = Box::into_raw(Box::new(layout)); + // CSS can't express "+" in the class + let name = overlay_name.unwrap_or(name).replace('+', "_"); + let name = CString::new(name).unwrap_or( + CString::new("").unwrap() + ); unsafe { - eekboard_context_service_set_layout(hint_manager, layout, 0); + // Take out the pointer to a temp variable so that it outlives the set_layout call. + let name = name.as_ptr(); + eekboard_context_service_set_layout(hint_manager, name, layout, 0); } } } diff --git a/src/meson.build b/src/meson.build index 5ec44ac7..45df867f 100644 --- a/src/meson.build +++ b/src/meson.build @@ -45,6 +45,7 @@ deps = [ dependency('gio-unix-2.0'), dependency('gnome-desktop-3.0', version: '>=3.0'), dependency('gtk+-3.0', version: '>=3.0'), + dependency('libbsd'), dependency('libfeedback-0.0'), dependency('wayland-client', version: '>=1.14'), dependency('xkbcommon'),