This should maybe work?
This commit is contained in:
parent
7941c2f6a3
commit
f9bea05bbb
1 changed files with 44 additions and 5 deletions
|
|
@ -1,22 +1,58 @@
|
||||||
// SPDX-License-Identifier: LGPL-3.0-or-later
|
// SPDX-License-Identifier: LGPL-3.0-or-later
|
||||||
|
|
||||||
use crate::task;
|
use crate::{task, widgets::SettingsEntry};
|
||||||
use cosmic_dbus_networkmanager::{
|
use cosmic_dbus_networkmanager::{
|
||||||
device::{wireless::WirelessDevice, SpecificDevice},
|
device::{wireless::WirelessDevice, SpecificDevice},
|
||||||
nm::NetworkManager,
|
nm::NetworkManager,
|
||||||
};
|
};
|
||||||
use futures_util::StreamExt;
|
use futures_util::StreamExt;
|
||||||
use gtk4::{
|
use gtk4::{
|
||||||
glib::{source::PRIORITY_DEFAULT, MainContext, Sender},
|
glib::{self, clone, source::PRIORITY_DEFAULT, MainContext, Sender},
|
||||||
prelude::*,
|
prelude::*,
|
||||||
|
Align, Image,
|
||||||
};
|
};
|
||||||
use tokio::sync::mpsc::UnboundedSender;
|
use std::{cell::RefCell, rc::Rc};
|
||||||
use zbus::Connection;
|
use zbus::Connection;
|
||||||
|
|
||||||
pub fn add_available_wifi(target: >k4::Box) {
|
pub fn add_available_wifi(target: >k4::Box) {
|
||||||
|
let ap_entries = Rc::<RefCell<Vec<SettingsEntry>>>::default();
|
||||||
let (tx, rx) = MainContext::channel::<Vec<AccessPoint>>(PRIORITY_DEFAULT);
|
let (tx, rx) = MainContext::channel::<Vec<AccessPoint>>(PRIORITY_DEFAULT);
|
||||||
task::spawn(scan_for_wifi(tx));
|
task::spawn(async move {
|
||||||
rx.attach(None, |aps| Continue(true));
|
if let Err(err) = scan_for_wifi(tx).await {
|
||||||
|
eprintln!("scan_for_wifi failed: {}", err);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
rx.attach(
|
||||||
|
None,
|
||||||
|
clone!(@strong ap_entries, @weak target => @default-return Continue(true), move |aps| {
|
||||||
|
build_aps_list(ap_entries.clone(), target, dbg!(aps));
|
||||||
|
Continue(true)
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
fn build_aps_list(
|
||||||
|
ap_entries: Rc<RefCell<Vec<SettingsEntry>>>,
|
||||||
|
target: gtk4::Box,
|
||||||
|
aps: Vec<AccessPoint>,
|
||||||
|
) {
|
||||||
|
let mut ap_entries = ap_entries.borrow_mut();
|
||||||
|
for old_ap_box in ap_entries.drain(..) {
|
||||||
|
target.remove(&old_ap_box);
|
||||||
|
}
|
||||||
|
for ap in aps {
|
||||||
|
view! {
|
||||||
|
ap_entry = SettingsEntry {
|
||||||
|
align_child: Align::Start,
|
||||||
|
set_title: &ap.ssid,
|
||||||
|
set_child: ap_icon = &Image {
|
||||||
|
set_icon_name: Some("network-wireless-symbolic"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
target.append(&ap_entry);
|
||||||
|
ap_entries.push(ap_entry);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn scan_for_wifi(tx: Sender<Vec<AccessPoint>>) -> zbus::Result<()> {
|
async fn scan_for_wifi(tx: Sender<Vec<AccessPoint>>) -> zbus::Result<()> {
|
||||||
|
|
@ -45,6 +81,7 @@ async fn handle_wireless_device(
|
||||||
let mut scan_changed = device.receive_last_scan_changed().await;
|
let mut scan_changed = device.receive_last_scan_changed().await;
|
||||||
if let Some(t) = scan_changed.next().await {
|
if let Some(t) = scan_changed.next().await {
|
||||||
if let Ok(-1) = t.get().await {
|
if let Ok(-1) = t.get().await {
|
||||||
|
eprintln!("scan errored");
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -56,9 +93,11 @@ async fn handle_wireless_device(
|
||||||
strength: ap.strength().await?,
|
strength: ap.strength().await?,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
tx.send(aps).expect("failed to send back to main thread");
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
struct AccessPoint {
|
struct AccessPoint {
|
||||||
ssid: String,
|
ssid: String,
|
||||||
strength: u8,
|
strength: u8,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue