diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 75d707d1..ea10ccb2 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -74,6 +74,7 @@ build_deb:arm64: build_deb:future: image: debian:sid + allow_failure: true tags: - aarch64 stage: build diff --git a/Cargo.deps b/Cargo.deps index 04f99e68..31bc0dc1 100644 --- a/Cargo.deps +++ b/Cargo.deps @@ -29,4 +29,4 @@ features = ["v3_22"] [dependencies.gtk-sys] version = "0.9" -features = ["v3_22"] +features = ["v3_22"] \ No newline at end of file diff --git a/Cargo.deps.online b/Cargo.deps.online new file mode 100644 index 00000000..df73d805 --- /dev/null +++ b/Cargo.deps.online @@ -0,0 +1,4 @@ +# Dependencies which are only used with online, crates.io builds. +[patch.crates-io] +# Dependency was yanked, but gio 0.7 needs it. +fragile = { git = "https://source.puri.sm/dorota.czaplejewicz/fragile.git", tag = "0.3.0" } \ No newline at end of file diff --git a/debian/cargo/config b/debian/cargo/config index 6c73885a..22f26415 100644 --- a/debian/cargo/config +++ b/debian/cargo/config @@ -9,4 +9,3 @@ replace-with = 'vendored-sources' [source.vendored-sources] directory = '/usr/share/cargo/registry' - diff --git a/debian/changelog b/debian/changelog index 1cad5545..c46245b1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,18 @@ +squeekboard (1.17.1-1) experimental; urgency=medium + + [ Dorota Czaplejewicz ] + * build: Replace missing crates.io dependency with Purism-hosted one + * ci: Allow failure on sid + * panel: Use scaling to set height + + [ William Wold ] + * Do not reset pending state on zwp_input_method_v2.done + + [ Arnaud Ferraris ] + * state: fix "wide mode" detection in portrait orientation + + -- Dorota Czaplejewicz Tue, 05 Apr 2022 13:32:53 +0000 + squeekboard (1.17.0-1) experimental; urgency=medium [ Dorota Czaplejewicz ] diff --git a/debian/rules b/debian/rules index a1fd6b49..c9ca998c 100755 --- a/debian/rules +++ b/debian/rules @@ -38,6 +38,6 @@ endif # causing Cargo to refuse to build with a crates.io copy override_dh_auto_configure: [ ! -f Cargo.lock ] || rm Cargo.lock - dh_auto_configure -- -Dnewer=$(newer) + dh_auto_configure -- -Dnewer=$(newer) -Donline=false override_dh_autoreconf: diff --git a/meson.build b/meson.build index 9928afc5..63b331a3 100644 --- a/meson.build +++ b/meson.build @@ -1,7 +1,7 @@ project( 'squeekboard', 'c', 'rust', - version: '1.17.0', + version: '1.17.1', license: 'GPLv3', meson_version: '>=0.51.0', default_options: [ @@ -96,19 +96,23 @@ cargo_toml_base = configure_file( configuration: path_data, ) - -cargo_deps = files('Cargo.deps') +cargo_patch = [] if get_option('newer') == true cargo_build_flags += ['--features', 'glib_v0_14'] cargo_deps = files('Cargo.deps.newer') +else + cargo_deps = files('Cargo.deps') + if get_option('online') == true + cargo_patch = [files('Cargo.deps.online')] + endif endif - + cat = find_program('cat') cargo_toml = custom_target( 'Cargo.toml', output: 'Cargo.toml', - command: [cat, cargo_toml_base, cargo_deps], + command: [cat, cargo_toml_base, cargo_deps] + cargo_patch, capture: true, ) diff --git a/meson_options.txt b/meson_options.txt index 16e9ae94..3e62b7be 100644 --- a/meson_options.txt +++ b/meson_options.txt @@ -11,6 +11,10 @@ option('newer', type: 'boolean', value: false, description: 'Build with dependencies newer than those of Byzantium') +option('online', + type: 'boolean', value: true, + description: 'Pull packages from the internet while building, as opposed to a local regstry.') + option('strict', type: 'boolean', value: true, description: 'Turn more warnings into errors') diff --git a/src/animation.rs b/src/animation.rs index 8a602fbd..b13ad37b 100644 --- a/src/animation.rs +++ b/src/animation.rs @@ -6,6 +6,7 @@ use std::time::Duration; +use crate::main::PixelSize; use crate::outputs::OutputId; /// The keyboard should hide after this has elapsed to prevent flickering. @@ -16,7 +17,7 @@ pub const HIDING_TIMEOUT: Duration = Duration::from_millis(200); pub enum Outcome { Visible { output: OutputId, - height: u32, + height: PixelSize, }, Hidden, } diff --git a/src/imservice.rs b/src/imservice.rs index da0f6749..14cbca16 100644 --- a/src/imservice.rs +++ b/src/imservice.rs @@ -154,11 +154,6 @@ pub mod c { let imservice = check_imservice(imservice, im).unwrap(); imservice.current = imservice.pending.clone(); - imservice.pending = IMProtocolState { - active: imservice.current.active, - ..IMProtocolState::default() - }; - imservice.serial += Wrapping(1u32); imservice.send_event(); } diff --git a/src/main.rs b/src/main.rs index cbd1a114..c32cf660 100644 --- a/src/main.rs +++ b/src/main.rs @@ -75,7 +75,7 @@ mod c { extern "C" { #[allow(improper_ctypes)] fn init_wayland(wayland: *mut Wayland); - fn server_context_service_update_keyboard(service: *const UIManager, output: WlOutput, height: u32); + fn server_context_service_update_keyboard(service: *const UIManager, output: WlOutput, scaled_height: u32); fn server_context_service_real_hide_keyboard(service: *const UIManager); fn server_context_service_set_hint_purpose(service: *const UIManager, hint: u32, purpose: u32); // This should probably only get called from the gtk main loop, @@ -151,7 +151,7 @@ mod c { ) { match msg.panel_visibility { Some(PanelCommand::Show { output, height }) => unsafe { - server_context_service_update_keyboard(ui_manager, output.0, height); + server_context_service_update_keyboard(ui_manager, output.0, height.as_scaled_ceiling()); }, Some(PanelCommand::Hide) => unsafe { server_context_service_real_hide_keyboard(ui_manager); @@ -177,11 +177,33 @@ mod c { } } +/// Size in pixels that is aware of scaling +#[derive(Clone, Copy, PartialEq, Debug)] +pub struct PixelSize { + pub pixels: u32, + pub scale_factor: u32, +} + +fn div_ceil(a: u32, b: u32) -> u32 { + // Given that it's for pixels on a screen, an overflow is unlikely. + (a + b - 1) / b +} + +impl PixelSize { + pub fn as_scaled_floor(&self) -> u32 { + self.pixels / self.scale_factor + } + + pub fn as_scaled_ceiling(&self) -> u32 { + div_ceil(self.pixels, self.scale_factor) + } +} + #[derive(Clone, PartialEq, Debug)] pub enum PanelCommand { Show { output: OutputId, - height: u32, + height: PixelSize, }, Hide, } diff --git a/src/server-context-service.c b/src/server-context-service.c index aa88ed6e..55e7f78d 100644 --- a/src/server-context-service.c +++ b/src/server-context-service.c @@ -139,9 +139,10 @@ server_context_service_real_hide_keyboard (ServerContextService *self) } // Called from rust -/// Updates the type of visibility +/// Updates the type of visibility. +/// Height is in scaled units. void -server_context_service_update_keyboard (ServerContextService *self, struct wl_output *output, uint32_t height) +server_context_service_update_keyboard (ServerContextService *self, struct wl_output *output, uint32_t scaled_height) { if (output != self->current_output) { // Recreate on a new output @@ -153,11 +154,11 @@ server_context_service_update_keyboard (ServerContextService *self, struct wl_ou "configured-height", &h, NULL); - if ((uint32_t)h != height) { + if ((uint32_t)h != scaled_height) { //TODO: make sure that redrawing happens in the correct place (it doesn't now). - phosh_layer_surface_set_size(self->window, 0, height); - phosh_layer_surface_set_exclusive_zone(self->window, height); + phosh_layer_surface_set_size(self->window, 0, scaled_height); + phosh_layer_surface_set_exclusive_zone(self->window, scaled_height); phosh_layer_surface_wl_surface_commit(self->window); self->current_output = output; @@ -169,7 +170,7 @@ server_context_service_update_keyboard (ServerContextService *self, struct wl_ou self->current_output = output; if (!self->window) { - make_window (self, output, height); + make_window (self, output, scaled_height); } if (!self->widget) { make_widget (self); diff --git a/src/state.rs b/src/state.rs index c65033df..5254a940 100644 --- a/src/state.rs +++ b/src/state.rs @@ -7,7 +7,7 @@ use crate::animation; use crate::imservice::{ ContentHint, ContentPurpose }; -use crate::main::{ Commands, PanelCommand }; +use crate::main::{ Commands, PanelCommand, PixelSize }; use crate::outputs; use crate::outputs::{OutputId, OutputState}; use std::cmp; @@ -238,14 +238,20 @@ impl Application { } } - fn get_preferred_height(output: &OutputState) -> Option { + fn get_preferred_height(output: &OutputState) -> Option { output.get_pixel_size() .map(|px_size| { let height = { if px_size.width > px_size.height { px_size.width / 5 } else { - if (px_size.width < 540) & (px_size.width > 0) { + let abstract_width + = PixelSize { + scale_factor: output.scale as u32, + pixels: px_size.width, + } + .as_scaled_ceiling(); + if (abstract_width < 540) && (px_size.width > 0) { px_size.width * 7 / 12 // to match 360×210 } else { // Here we switch to wide layout, less height needed @@ -253,7 +259,10 @@ impl Application { } } }; - cmp::min(height, px_size.height / 2) + PixelSize { + scale_factor: output.scale as u32, + pixels: cmp::min(height, px_size.height / 2), + } }) } @@ -265,10 +274,10 @@ impl Application { Some(output) => { // Hoping that this will get optimized out on branches not using `visible`. let height = Self::get_preferred_height(self.outputs.get(&output).unwrap()) - .unwrap_or(0); + .unwrap_or(PixelSize{pixels: 0, scale_factor: 1}); // TODO: Instead of setting size to 0 when the output is invalid, // simply go invisible. - let visible = animation::Outcome::Visible{output, height}; + let visible = animation::Outcome::Visible{ output, height }; match (self.physical_keyboard, self.visibility_override) { (_, visibility::State::ForcedHidden) => animation::Outcome::Hidden,