bluetooth: Fix bluetooth switch transitions

This commit changes the switch to do a proper delayed state change using
the state-set signal. Also changed is that we always update the switch
state rather than avoiding an update when it is not powered.

Avoiding this update was introduced in commit 4a009da483 (bluetooth:
Don't change the switch status when transitioning), however, the current
implementation causes us to get stuck in the wrong visual state
sometimes. Also, with this patch I am unable to see any visual glitch on
hardware that should be affected, and even if there was a glitch,
getting the final state right is more important.

Closes: #607, #1272
This commit is contained in:
Benjamin Berg 2021-05-20 16:34:38 +02:00 committed by Robert Ancell
parent 9c8f097a38
commit 75c3e11708
2 changed files with 10 additions and 17 deletions

View file

@ -104,11 +104,8 @@ airplane_mode_changed_cb (GObject *source_object,
}
static void
enable_switch_changed_cb (CcBluetoothPanel *self)
enable_switch_state_set_cb (CcBluetoothPanel *self, gboolean state)
{
gboolean state;
state = gtk_switch_get_active (self->enable_switch);
g_debug ("Power switched to %s", state ? "on" : "off");
g_dbus_proxy_call (self->properties,
"Set",
@ -117,20 +114,19 @@ enable_switch_changed_cb (CcBluetoothPanel *self)
G_DBUS_CALL_FLAGS_NONE,
-1,
cc_panel_get_cancellable (CC_PANEL (self)),
airplane_mode_changed_cb, GUINT_TO_POINTER(state));
airplane_mode_changed_cb, self);
}
static void
adapter_status_changed_cb (CcBluetoothPanel *self)
{
GtkAlign valign;
gboolean sensitive, powered, change_powered;
gboolean sensitive, powered;
GtkWidget *page;
g_debug ("Updating airplane mode: BluetoothHasAirplaneMode %d, BluetoothHardwareAirplaneMode %d, BluetoothAirplaneMode %d, AirplaneMode %d",
self->has_airplane_mode, self->hardware_airplane_mode, self->bt_airplane_mode, self->airplane_mode);
change_powered = TRUE;
valign = GTK_ALIGN_CENTER;
if (self->has_airplane_mode == FALSE) {
@ -150,9 +146,9 @@ adapter_status_changed_cb (CcBluetoothPanel *self)
page = GTK_WIDGET (self->airplane_box);
} else if (self->bt_airplane_mode ||
!bluetooth_settings_widget_get_default_adapter_powered (self->settings_widget)) {
g_debug ("Default adapter is unpowered, but should be available");
g_debug ("Default adapter is unpowered");
sensitive = TRUE;
change_powered = FALSE;
powered = FALSE;
page = GTK_WIDGET (self->disabled_box);
} else {
g_debug ("Bluetooth is available and powered");
@ -164,12 +160,9 @@ adapter_status_changed_cb (CcBluetoothPanel *self)
gtk_widget_set_valign (GTK_WIDGET (self->stack), valign);
gtk_widget_set_sensitive (GTK_WIDGET (self->header_box), sensitive);
if (change_powered) {
g_signal_handlers_block_by_func (self->enable_switch, enable_switch_changed_cb, self);
gtk_switch_set_active (self->enable_switch, powered);
g_signal_handlers_unblock_by_func (self->enable_switch, enable_switch_changed_cb, self);
}
g_signal_handlers_block_by_func (self->enable_switch, enable_switch_state_set_cb, self);
gtk_switch_set_state (self->enable_switch, powered);
g_signal_handlers_unblock_by_func (self->enable_switch, enable_switch_state_set_cb, self);
gtk_stack_set_visible_child (self->stack, page);
}
@ -249,7 +242,7 @@ cc_bluetooth_panel_class_init (CcBluetoothPanelClass *klass)
gtk_widget_class_bind_template_callback (widget_class, adapter_status_changed_cb);
gtk_widget_class_bind_template_callback (widget_class, airplane_mode_off_button_clicked_cb);
gtk_widget_class_bind_template_callback (widget_class, enable_switch_changed_cb);
gtk_widget_class_bind_template_callback (widget_class, enable_switch_state_set_cb);
gtk_widget_class_bind_template_callback (widget_class, panel_changed_cb);
}

View file

@ -186,7 +186,7 @@
<property name="visible">True</property>
<property name="can_focus">True</property>
<property name="valign">center</property>
<signal name="notify::active" handler="enable_switch_changed_cb" object="CcBluetoothPanel" swapped="yes"/>
<signal name="state-set" handler="enable_switch_state_set_cb" object="CcBluetoothPanel" swapped="yes"/>
</object>
<packing>
<property name="expand">False</property>