diff --git a/eekboard/eekboard-context-service.c b/eekboard/eekboard-context-service.c index f74382be..cf5e7e4d 100644 --- a/eekboard/eekboard-context-service.c +++ b/eekboard/eekboard-context-service.c @@ -116,6 +116,7 @@ settings_get_layout(GSettings *settings, char **type, char **layout) GVariant *inputs = g_settings_get_value(settings, "sources"); // current layout is always first g_variant_get_child(inputs, 0, "(ss)", type, layout); + g_variant_unref(inputs); } void @@ -139,9 +140,11 @@ eekboard_context_service_update_layout(EekboardContextService *context, enum squ switch (priv->purpose) { case ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_NUMBER: case ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_PHONE: + g_free(keyboard_layout); keyboard_layout = g_strdup("number"); break; case ZWP_TEXT_INPUT_V3_CONTENT_PURPOSE_TERMINAL: + g_free(keyboard_layout); keyboard_layout = g_strdup("terminal"); break; default: diff --git a/src/popover.rs b/src/popover.rs index 5f0f735f..ce1543ba 100644 --- a/src/popover.rs +++ b/src/popover.rs @@ -91,6 +91,11 @@ mod variants { unsafe { let ret = glib_sys::g_variant_builder_end(builder); glib_sys::g_variant_builder_unref(builder); + // HACK: This is to prevent C taking ownership + // of "floating" Variants, + // where Rust gets to keep a stale reference + // and crash when trying to drop it. + glib_sys::g_variant_ref_sink(ret); glib::Variant::from_glib_full(ret) } } @@ -141,7 +146,7 @@ fn set_layout(kind: String, name: String) { .chain(inputs).collect(); settings.set_value( "sources", - &variants::ArrayPairString(inputs).to_variant() + &variants::ArrayPairString(inputs).to_variant(), ); settings.apply(); }