Merge branch 'unavailable' into 'master'
Crash less when outside resources are unavailable See merge request Librem5/squeekboard!341
This commit is contained in:
@ -113,6 +113,9 @@ eekboard_context_service_dispose (GObject *object)
|
|||||||
static void
|
static void
|
||||||
settings_get_layout(GSettings *settings, char **type, char **layout)
|
settings_get_layout(GSettings *settings, char **type, char **layout)
|
||||||
{
|
{
|
||||||
|
if (!settings) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
GVariant *inputs = g_settings_get_value(settings, "sources");
|
GVariant *inputs = g_settings_get_value(settings, "sources");
|
||||||
if (g_variant_n_children(inputs) == 0) {
|
if (g_variant_n_children(inputs) == 0) {
|
||||||
g_warning("No system layout present");
|
g_warning("No system layout present");
|
||||||
@ -257,14 +260,29 @@ eekboard_context_service_init (EekboardContextService *self)
|
|||||||
g_direct_equal,
|
g_direct_equal,
|
||||||
NULL,
|
NULL,
|
||||||
(GDestroyNotify)g_object_unref);
|
(GDestroyNotify)g_object_unref);
|
||||||
|
const char *schema_name = "org.gnome.desktop.input-sources";
|
||||||
self->priv->settings = g_settings_new ("org.gnome.desktop.input-sources");
|
GSettingsSchemaSource *ssrc = g_settings_schema_source_get_default();
|
||||||
|
if (ssrc) {
|
||||||
|
GSettingsSchema *schema = g_settings_schema_source_lookup(ssrc,
|
||||||
|
schema_name,
|
||||||
|
TRUE);
|
||||||
|
if (schema) {
|
||||||
|
// Not referencing the found schema directly,
|
||||||
|
// because it's not clear how...
|
||||||
|
self->priv->settings = g_settings_new (schema_name);
|
||||||
gulong conn_id = g_signal_connect(self->priv->settings, "change-event",
|
gulong conn_id = g_signal_connect(self->priv->settings, "change-event",
|
||||||
G_CALLBACK(settings_handle_layout_changed),
|
G_CALLBACK(settings_handle_layout_changed),
|
||||||
self);
|
self);
|
||||||
if (conn_id == 0) {
|
if (conn_id == 0) {
|
||||||
g_warning ("Could not connect to gsettings updates, layout"
|
g_warning ("Could not connect to gsettings updates, "
|
||||||
" changing unavailable");
|
"automatic layout changing unavailable");
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
g_warning("Gsettings schema %s is not installed on the system. "
|
||||||
|
"Layout switching unavailable", schema_name);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
g_warning("No gsettings schemas installed. Layout switching unavailable.");
|
||||||
}
|
}
|
||||||
|
|
||||||
self->priv->overlay = NULL;
|
self->priv->overlay = NULL;
|
||||||
|
|||||||
@ -132,8 +132,28 @@ fn make_menu_builder(inputs: Vec<(&str, OwnedTranslation)>) -> gtk::Builder {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_settings(schema_name: &str) -> Option<gio::Settings> {
|
||||||
|
let mut error_handler = logging::Print{};
|
||||||
|
gio::SettingsSchemaSource::get_default()
|
||||||
|
.or_warn(
|
||||||
|
&mut error_handler,
|
||||||
|
logging::Problem::Surprise,
|
||||||
|
"No gsettings schemas installed.",
|
||||||
|
)
|
||||||
|
.and_then(|sss|
|
||||||
|
sss.lookup(schema_name, true)
|
||||||
|
.or_warn(
|
||||||
|
&mut error_handler,
|
||||||
|
logging::Problem::Surprise,
|
||||||
|
&format!("Gsettings schema {} not installed", schema_name),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.map(|_sschema| gio::Settings::new(schema_name))
|
||||||
|
}
|
||||||
|
|
||||||
fn set_layout(kind: String, name: String) {
|
fn set_layout(kind: String, name: String) {
|
||||||
let settings = gio::Settings::new("org.gnome.desktop.input-sources");
|
let settings = get_settings("org.gnome.desktop.input-sources");
|
||||||
|
if let Some(settings) = settings {
|
||||||
let inputs = settings.get_value("sources").unwrap();
|
let inputs = settings.get_value("sources").unwrap();
|
||||||
let current = (kind.clone(), name.clone());
|
let current = (kind.clone(), name.clone());
|
||||||
let inputs = variants::get_tuples(inputs).into_iter()
|
let inputs = variants::get_tuples(inputs).into_iter()
|
||||||
@ -145,6 +165,7 @@ fn set_layout(kind: String, name: String) {
|
|||||||
&variants::ArrayPairString(inputs).to_variant(),
|
&variants::ArrayPairString(inputs).to_variant(),
|
||||||
);
|
);
|
||||||
settings.apply();
|
settings.apply();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A reference to what the user wants to see
|
/// A reference to what the user wants to see
|
||||||
@ -284,9 +305,13 @@ pub fn show(
|
|||||||
let overlay_layouts = resources::get_overlays().into_iter()
|
let overlay_layouts = resources::get_overlays().into_iter()
|
||||||
.map(|name| LayoutId::Local(name.to_string()));
|
.map(|name| LayoutId::Local(name.to_string()));
|
||||||
|
|
||||||
let settings = gio::Settings::new("org.gnome.desktop.input-sources");
|
let settings = get_settings("org.gnome.desktop.input-sources");
|
||||||
|
let inputs = settings
|
||||||
|
.map(|settings| {
|
||||||
let inputs = settings.get_value("sources").unwrap();
|
let inputs = settings.get_value("sources").unwrap();
|
||||||
let inputs = variants::get_tuples(inputs);
|
variants::get_tuples(inputs)
|
||||||
|
})
|
||||||
|
.unwrap_or_else(|| Vec::new());
|
||||||
|
|
||||||
let system_layouts: Vec<LayoutId> = inputs.into_iter()
|
let system_layouts: Vec<LayoutId> = inputs.into_iter()
|
||||||
.map(|(kind, name)| LayoutId::System { kind, name })
|
.map(|(kind, name)| LayoutId::System { kind, name })
|
||||||
|
|||||||
@ -222,9 +222,9 @@ main (int argc, char **argv)
|
|||||||
error = NULL;
|
error = NULL;
|
||||||
connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
|
connection = g_bus_get_sync (G_BUS_TYPE_SESSION, NULL, &error);
|
||||||
if (connection == NULL) {
|
if (connection == NULL) {
|
||||||
g_printerr ("Can't connect to the bus: %s\n", error->message);
|
g_printerr ("Can't connect to the bus: %s. "
|
||||||
|
"Visibility switching unavailable.", error->message);
|
||||||
g_error_free (error);
|
g_error_free (error);
|
||||||
exit (1);
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case G_BUS_TYPE_NONE:
|
case G_BUS_TYPE_NONE:
|
||||||
@ -246,8 +246,10 @@ main (int argc, char **argv)
|
|||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
guint owner_id = 0;
|
||||||
DBusHandler *service = dbus_handler_new(connection, DBUS_SERVICE_PATH);
|
DBusHandler *service = NULL;
|
||||||
|
if (connection) {
|
||||||
|
service = dbus_handler_new(connection, DBUS_SERVICE_PATH);
|
||||||
|
|
||||||
if (service == NULL) {
|
if (service == NULL) {
|
||||||
g_printerr ("Can't create dbus server\n");
|
g_printerr ("Can't create dbus server\n");
|
||||||
@ -255,7 +257,7 @@ main (int argc, char **argv)
|
|||||||
}
|
}
|
||||||
instance.dbus_handler = service;
|
instance.dbus_handler = service;
|
||||||
|
|
||||||
guint owner_id = g_bus_own_name_on_connection (connection,
|
owner_id = g_bus_own_name_on_connection (connection,
|
||||||
DBUS_SERVICE_INTERFACE,
|
DBUS_SERVICE_INTERFACE,
|
||||||
G_BUS_NAME_OWNER_FLAGS_NONE,
|
G_BUS_NAME_OWNER_FLAGS_NONE,
|
||||||
on_name_acquired,
|
on_name_acquired,
|
||||||
@ -266,6 +268,7 @@ main (int argc, char **argv)
|
|||||||
g_printerr ("Can't own the name\n");
|
g_printerr ("Can't own the name\n");
|
||||||
exit (1);
|
exit (1);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
instance.submission = get_submission(instance.wayland.input_method_manager,
|
instance.submission = get_submission(instance.wayland.input_method_manager,
|
||||||
instance.wayland.virtual_keyboard_manager,
|
instance.wayland.virtual_keyboard_manager,
|
||||||
@ -296,9 +299,15 @@ main (int argc, char **argv)
|
|||||||
|
|
||||||
g_main_loop_run (loop);
|
g_main_loop_run (loop);
|
||||||
|
|
||||||
|
if (connection) {
|
||||||
|
if (service) {
|
||||||
|
if (owner_id != 0) {
|
||||||
g_bus_unown_name (owner_id);
|
g_bus_unown_name (owner_id);
|
||||||
|
}
|
||||||
g_object_unref (service);
|
g_object_unref (service);
|
||||||
|
}
|
||||||
g_object_unref (connection);
|
g_object_unref (connection);
|
||||||
|
}
|
||||||
g_main_loop_unref (loop);
|
g_main_loop_unref (loop);
|
||||||
|
|
||||||
squeek_wayland_deinit (&instance.wayland);
|
squeek_wayland_deinit (&instance.wayland);
|
||||||
|
|||||||
Reference in New Issue
Block a user