Skip to content

Commit 8796abb

Browse files
committed
fix: Properly handle wifi and bluetooth turned on and off
1 parent e1be42a commit 8796abb

File tree

9 files changed

+46
-26
lines changed

9 files changed

+46
-26
lines changed

Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
[package]
22
name = "reset"
3-
version = "0.1.6"
3+
version = "0.1.8"
44
edition = "2021"
55
description = "A wip universal Linux settings application."
66
repository = "https://github.com/Xetibo/ReSet"
77
license = "GPL-3.0-only"
88

99
[dependencies]
10-
reset_daemon = "0.7.1"
10+
reset_daemon = "0.7.2"
1111
re_set-lib = "0.8.7"
1212
adw = { version = "0.5.3", package = "libadwaita", features = ["v1_4"] }
1313
dbus = "0.9.7"

PKGBUILD

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
# Maintainer: Fabio Lenherr <dashie@dashie.org>
22

33
pkgname=reset
4-
pkgver=0.1.6
4+
pkgver=0.1.8
55
pkgrel=0
66
arch=('x86_64')
77
pkgdir="/usr/bin/${pkgname}"

src/components/bluetooth/bluetooth_box.rs

Lines changed: 28 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use adw::subclass::prelude::ObjectSubclassIsExt;
99
use dbus::blocking::Connection;
1010
use dbus::message::SignalArgs;
1111
use dbus::{Error, Path};
12-
use glib::{clone, Cast};
12+
use glib::{clone, Cast, PropertySet};
1313
use gtk::glib::Variant;
1414
use gtk::prelude::{ActionableExt, ButtonExt, ListBoxRowExt, WidgetExt};
1515
use gtk::{gio, StringObject};
@@ -48,6 +48,7 @@ fn setup_callbacks(
4848
let bluetooth_box_ref = bluetooth_box.clone();
4949
let listeners_ref = listeners.clone();
5050
let imp = bluetooth_box.imp();
51+
imp.reset_switch_initial.set(true);
5152
imp.reset_visibility.set_activatable(true);
5253
imp.reset_visibility
5354
.set_action_name(Some("navigation.push"));
@@ -77,11 +78,15 @@ fn setup_callbacks(
7778
set_bluetooth_adapter_pairability(imp.reset_current_bluetooth_adapter.borrow().path.clone(), state.is_active());
7879
}));
7980

80-
imp.reset_bluetooth_switch
81-
.connect_state_set(move |_, state| {
81+
imp.reset_bluetooth_switch.connect_state_set(
82+
clone!(@weak imp => @default-return glib::Propagation::Proceed, move |_, state| {
83+
if imp.reset_switch_initial.load(Ordering::SeqCst) {
84+
return glib::Propagation::Proceed;
85+
}
8286
if !state {
8387
let imp = bluetooth_box_ref.imp();
8488
let mut available_devices = imp.available_devices.borrow_mut();
89+
let mut current_adapter = imp.reset_current_bluetooth_adapter.borrow_mut();
8590
for entry in available_devices.iter() {
8691
imp.reset_bluetooth_available_devices.remove(&**entry.1);
8792
}
@@ -102,10 +107,13 @@ fn setup_callbacks(
102107
listeners_ref
103108
.bluetooth_listener
104109
.store(false, Ordering::SeqCst);
105-
set_adapter_enabled(
106-
imp.reset_current_bluetooth_adapter.borrow().path.clone(),
110+
let res = set_adapter_enabled(
111+
current_adapter.path.clone(),
107112
false,
108113
);
114+
if res {
115+
current_adapter.powered = false;
116+
}
109117
} else {
110118
let restart_ref = bluetooth_box_ref.clone();
111119
let restart_listener_ref = listeners_ref.clone();
@@ -115,21 +123,21 @@ fn setup_callbacks(
115123
imp.reset_bluetooth_pairable_switch.set_sensitive(true);
116124
}
117125
gio::spawn_blocking(move || {
126+
let mut current_adapter = restart_ref.imp().reset_current_bluetooth_adapter.borrow_mut();
118127
if set_adapter_enabled(
119-
restart_ref
120-
.imp()
121-
.reset_current_bluetooth_adapter
122-
.borrow()
128+
current_adapter
123129
.path
124130
.clone(),
125131
true,
126132
) {
133+
current_adapter.powered = true;
127134
start_bluetooth_listener(restart_listener_ref.clone(), restart_ref.clone());
128135
}
129136
});
130137
}
131138
glib::Propagation::Proceed
132-
});
139+
}),
140+
);
133141
bluetooth_box
134142
}
135143

@@ -169,12 +177,14 @@ pub fn populate_conntected_bluetooth_devices(bluetooth_box: Arc<BluetoothBox>) {
169177

170178
{
171179
let current_adapter = imp.reset_current_bluetooth_adapter.borrow();
172-
imp.reset_bluetooth_switch
173-
.set_state(current_adapter.powered);
180+
let powered = current_adapter.powered;
181+
imp.reset_bluetooth_switch.set_state(powered);
182+
imp.reset_bluetooth_switch.set_active(powered);
174183
imp.reset_bluetooth_discoverable_switch
175184
.set_active(current_adapter.discoverable);
176185
imp.reset_bluetooth_pairable_switch
177186
.set_active(current_adapter.pairable);
187+
imp.reset_switch_initial.set(false);
178188
}
179189

180190
imp.reset_bluetooth_adapter.connect_selected_notify(
@@ -219,6 +229,11 @@ pub fn start_bluetooth_listener(listeners: Arc<Listeners>, bluetooth_box: Arc<Bl
219229
if listeners.bluetooth_listener.load(Ordering::SeqCst) {
220230
return;
221231
}
232+
let imp = bluetooth_box.imp();
233+
234+
if !imp.reset_current_bluetooth_adapter.borrow().powered {
235+
return;
236+
}
222237

223238
let device_added_box = bluetooth_box.clone();
224239
let device_removed_box = bluetooth_box.clone();
@@ -228,9 +243,7 @@ pub fn start_bluetooth_listener(listeners: Arc<Listeners>, bluetooth_box: Arc<Bl
228243
let conn = Connection::new_session().unwrap();
229244
let proxy = conn.with_proxy(BASE, DBUS_PATH, Duration::from_millis(1000));
230245
let _: Result<(), Error> = proxy.method_call(BLUETOOTH, "StartBluetoothListener", ());
231-
loop_box
232-
.imp()
233-
.reset_bluetooth_available_devices
246+
imp.reset_bluetooth_available_devices
234247
.set_description(Some("Scanning..."));
235248
let device_added =
236249
BluetoothDeviceAdded::match_rule(Some(&BASE.into()), Some(&Path::from(DBUS_PATH)))

src/components/bluetooth/bluetooth_box_impl.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ use gtk::{prelude::*, StringList};
66
use re_set_lib::bluetooth::bluetooth_structures::BluetoothAdapter;
77
use std::cell::RefCell;
88
use std::collections::HashMap;
9+
use std::sync::atomic::AtomicBool;
910
use std::sync::{Arc, RwLock};
1011

1112
use crate::components::base::list_entry::ListEntry;
@@ -41,6 +42,7 @@ pub struct BluetoothBox {
4142
pub reset_current_bluetooth_adapter: Arc<RefCell<BluetoothAdapter>>,
4243
pub reset_model_list: Arc<RwLock<StringList>>,
4344
pub reset_model_index: Arc<RwLock<u32>>,
45+
pub reset_switch_initial: AtomicBool,
4446
}
4547

4648
#[glib::object_subclass]

src/components/wifi/wifi_box.rs

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ impl WifiBox {
5050
fn setup_callbacks(listeners: Arc<Listeners>, wifi_box: Arc<WifiBox>) -> Arc<WifiBox> {
5151
let imp = wifi_box.imp();
5252
let wifibox_ref = wifi_box.clone();
53+
imp.reset_switch_initial.set(true);
5354
imp.reset_saved_networks.set_activatable(true);
5455
imp.reset_saved_networks
5556
.set_action_name(Some("navigation.push"));
@@ -62,6 +63,9 @@ fn setup_callbacks(listeners: Arc<Listeners>, wifi_box: Arc<WifiBox>) -> Arc<Wif
6263
set_combo_row_ellipsis(imp.reset_wifi_device.get());
6364
imp.reset_wifi_switch.connect_state_set(
6465
clone!(@weak imp => @default-return glib::Propagation::Proceed, move |_, value| {
66+
if imp.reset_switch_initial.load(Ordering::SeqCst) {
67+
return glib::Propagation::Proceed;
68+
}
6569
set_wifi_enabled(value);
6670
if !value {
6771
imp.reset_wifi_devices.write().unwrap().clear();
@@ -93,17 +97,17 @@ pub fn scan_for_wifi(wifi_box: Arc<WifiBox>) {
9397
let wifi_entries_path = wifi_box.imp().wifi_entries_path.clone();
9498

9599
gio::spawn_blocking(move || {
100+
let wifi_status = get_wifi_status();
96101
let devices = get_wifi_devices();
102+
if devices.is_empty() {
103+
return;
104+
}
97105
let access_points = get_access_points();
98-
let wifi_status = get_wifi_status();
99106
{
100107
let imp = wifibox_ref.imp();
101108
let list = imp.reset_model_list.write().unwrap();
102109
let mut model_index = imp.reset_model_index.write().unwrap();
103110
let mut map = imp.reset_wifi_devices.write().unwrap();
104-
if devices.is_empty() {
105-
return;
106-
}
107111
imp.reset_current_wifi_device
108112
.replace(devices.last().unwrap().clone());
109113
for (index, device) in devices.into_iter().enumerate() {
@@ -121,8 +125,9 @@ pub fn scan_for_wifi(wifi_box: Arc<WifiBox>) {
121125
let mut wifi_entries_path = wifi_entries_path.write().unwrap();
122126
let imp = wifibox_ref.imp();
123127

124-
imp.reset_wifi_switch.set_active(wifi_status);
125128
imp.reset_wifi_switch.set_state(wifi_status);
129+
imp.reset_wifi_switch.set_active(wifi_status);
130+
imp.reset_switch_initial.set(false);
126131

127132
let list = imp.reset_model_list.read().unwrap();
128133
imp.reset_wifi_device.set_model(Some(&*list));

src/components/wifi/wifi_box_impl.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ use gtk::{prelude::*, StringList};
77
use re_set_lib::network::network_structures::WifiDevice;
88
use std::cell::RefCell;
99
use std::collections::HashMap;
10+
use std::sync::atomic::AtomicBool;
1011
use std::sync::{Arc, RwLock};
1112

1213
use crate::components::base::list_entry::ListEntry;
@@ -37,6 +38,7 @@ pub struct WifiBox {
3738
pub reset_current_wifi_device: Arc<RefCell<WifiDevice>>,
3839
pub reset_model_list: Arc<RwLock<StringList>>,
3940
pub reset_model_index: Arc<RwLock<u32>>,
41+
pub reset_switch_initial: AtomicBool,
4042
}
4143

4244
unsafe impl Send for WifiBox {}

src/components/window/reset_window.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ impl ReSetWindow {
103103
.license_type(gtk::License::Gpl30)
104104
.website("https://github.com/Xetibo/ReSet")
105105
.issue_url("https://github.com/Xetibo/ReSet/issues")
106-
.version("0.1.6")
106+
.version("0.1.8")
107107
.transient_for(window)
108108
.modal(true)
109109
.copyright("© 2022-2023 Xetibo")

src/resources/resetUI.cmb

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -373,7 +373,6 @@
373373
(4,183,"GtkLabel","label","WiFi",None,None,None,None,None,None,None,None,None),
374374
(4,183,"GtkWidget","css-classes","resetSettingLabel",None,None,None,None,None,None,None,None,None),
375375
(4,183,"GtkWidget","margin-start","5",None,None,None,None,None,None,None,None,None),
376-
(4,184,"GtkSwitch","active","True",None,None,None,None,None,None,None,None,None),
377376
(4,184,"GtkWidget","halign","end",None,None,None,None,None,None,None,None,None),
378377
(4,184,"GtkWidget","hexpand","True",None,None,None,None,None,None,None,None,None),
379378
(4,184,"GtkWidget","margin-end","5",None,None,None,None,None,None,None,None,None),

src/resources/resetWiFi.ui

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@
2121
</child>
2222
<child>
2323
<object class="GtkSwitch" id="reset_wifi_switch">
24-
<property name="active">True</property>
2524
<property name="halign">end</property>
2625
<property name="hexpand">True</property>
2726
<property name="margin-end">5</property>

0 commit comments

Comments
 (0)