cache active apps
This commit is contained in:
parent
d731ab5f41
commit
fe0fc2e0e3
1 changed files with 23 additions and 76 deletions
|
|
@ -1,44 +1,4 @@
|
||||||
use futures_util::stream::StreamExt;
|
#![feature(iter_zip)]
|
||||||
|
|
||||||
use zbus::{dbus_proxy, Connection, Result};
|
|
||||||
use zvariant::ObjectPath;
|
|
||||||
|
|
||||||
#[dbus_proxy(
|
|
||||||
default_service = "org.freedesktop.GeoClue2",
|
|
||||||
interface = "org.freedesktop.GeoClue2.Manager",
|
|
||||||
default_path = "/org/freedesktop/GeoClue2/Manager"
|
|
||||||
)]
|
|
||||||
trait Manager {
|
|
||||||
#[dbus_proxy(object = "Client")]
|
|
||||||
fn get_client(&self);
|
|
||||||
}
|
|
||||||
|
|
||||||
#[dbus_proxy(
|
|
||||||
default_service = "org.freedesktop.GeoClue2",
|
|
||||||
interface = "org.freedesktop.GeoClue2.Client"
|
|
||||||
)]
|
|
||||||
trait Client {
|
|
||||||
fn start(&self) -> Result<()>;
|
|
||||||
fn stop(&self) -> Result<()>;
|
|
||||||
|
|
||||||
#[dbus_proxy(property)]
|
|
||||||
fn set_desktop_id(&mut self, id: &str) -> Result<()>;
|
|
||||||
|
|
||||||
#[dbus_proxy(signal)]
|
|
||||||
fn location_updated(&self, old: ObjectPath<'_>, new: ObjectPath<'_>) -> Result<()>;
|
|
||||||
}
|
|
||||||
|
|
||||||
#[dbus_proxy(
|
|
||||||
default_service = "org.freedesktop.GeoClue2",
|
|
||||||
interface = "org.freedesktop.GeoClue2.Location"
|
|
||||||
)]
|
|
||||||
trait Location {
|
|
||||||
#[dbus_proxy(property)]
|
|
||||||
fn latitude(&self) -> Result<f64>;
|
|
||||||
#[dbus_proxy(property)]
|
|
||||||
fn longitude(&self) -> Result<f64>;
|
|
||||||
}
|
|
||||||
|
|
||||||
mod dock_item;
|
mod dock_item;
|
||||||
mod dock_object;
|
mod dock_object;
|
||||||
mod utils;
|
mod utils;
|
||||||
|
|
@ -46,6 +6,7 @@ mod window;
|
||||||
|
|
||||||
use crate::utils::BoxedSearchResults;
|
use crate::utils::BoxedSearchResults;
|
||||||
use async_io::Timer;
|
use async_io::Timer;
|
||||||
|
use futures::StreamExt;
|
||||||
use gdk4::Display;
|
use gdk4::Display;
|
||||||
use gio::DesktopAppInfo;
|
use gio::DesktopAppInfo;
|
||||||
use gtk::gio;
|
use gtk::gio;
|
||||||
|
|
@ -56,6 +17,7 @@ use gtk4 as gtk;
|
||||||
use gtk4::CssProvider;
|
use gtk4::CssProvider;
|
||||||
use gtk4::StyleContext;
|
use gtk4::StyleContext;
|
||||||
use once_cell::sync::OnceCell;
|
use once_cell::sync::OnceCell;
|
||||||
|
use pop_launcher::SearchResult;
|
||||||
use pop_launcher_service::IpcClient;
|
use pop_launcher_service::IpcClient;
|
||||||
use postage::mpsc::Sender;
|
use postage::mpsc::Sender;
|
||||||
use postage::prelude::*;
|
use postage::prelude::*;
|
||||||
|
|
@ -74,7 +36,6 @@ pub enum Event {
|
||||||
Response(pop_launcher::Response),
|
Response(pop_launcher::Response),
|
||||||
Search(String),
|
Search(String),
|
||||||
Activate(u32),
|
Activate(u32),
|
||||||
Loc(f64, f64),
|
|
||||||
}
|
}
|
||||||
|
|
||||||
fn spawn_launcher(tx: Sender<Event>) -> IpcClient {
|
fn spawn_launcher(tx: Sender<Event>) -> IpcClient {
|
||||||
|
|
@ -92,37 +53,12 @@ fn spawn_launcher(tx: Sender<Event>) -> IpcClient {
|
||||||
// TODO listen for signal indicating change from dock service...
|
// TODO listen for signal indicating change from dock service...
|
||||||
let mut sender = tx.clone();
|
let mut sender = tx.clone();
|
||||||
glib::MainContext::default().spawn_local(async move {
|
glib::MainContext::default().spawn_local(async move {
|
||||||
// loop {
|
loop {
|
||||||
let _ = sender.send(Event::Search(String::new())).await;
|
let _ = sender.send(Event::Search(String::new())).await;
|
||||||
Timer::after(Duration::from_secs(1)).await;
|
Timer::after(Duration::from_secs(1)).await;
|
||||||
// }
|
|
||||||
});
|
|
||||||
|
|
||||||
let mut sender = tx.clone();
|
|
||||||
glib::MainContext::default().spawn_local(async move {
|
|
||||||
let conn = Connection::system().await.unwrap();
|
|
||||||
let manager = ManagerProxy::new(&conn).await.unwrap();
|
|
||||||
let mut client = manager.get_client().await.unwrap();
|
|
||||||
|
|
||||||
client.set_desktop_id("org.freedesktop.zbus").await.unwrap();
|
|
||||||
let mut location_updated_stream = client.receive_location_updated().await.unwrap();
|
|
||||||
|
|
||||||
client.start().await.unwrap();
|
|
||||||
while let Some(signal) = location_updated_stream.next().await {
|
|
||||||
let args = signal.args().unwrap();
|
|
||||||
|
|
||||||
let location = LocationProxy::builder(&conn)
|
|
||||||
.path(args.new())
|
|
||||||
.unwrap()
|
|
||||||
.build()
|
|
||||||
.await
|
|
||||||
.unwrap();
|
|
||||||
let lat = location.latitude().await.unwrap();
|
|
||||||
let long = location.longitude().await.unwrap();
|
|
||||||
println!("Latitude: {}\nLongitude: {}", lat, long,);
|
|
||||||
let _ = sender.send(Event::Loc(lat, long)).await;
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
launcher
|
launcher
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -179,13 +115,11 @@ fn main() {
|
||||||
let window = Window::new(app);
|
let window = Window::new(app);
|
||||||
window.show();
|
window.show();
|
||||||
|
|
||||||
|
let cached_results: Vec<SearchResult> = vec![];
|
||||||
glib::MainContext::default().spawn_local(async move {
|
glib::MainContext::default().spawn_local(async move {
|
||||||
|
futures::pin_mut!(cached_results);
|
||||||
while let Some(event) = rx.recv().await {
|
while let Some(event) = rx.recv().await {
|
||||||
match event {
|
match event {
|
||||||
Event::Loc(lat, long) => {
|
|
||||||
dbg!(lat);
|
|
||||||
dbg!(long);
|
|
||||||
}
|
|
||||||
Event::Search(search) => {
|
Event::Search(search) => {
|
||||||
let _ = launcher.send(pop_launcher::Request::Search(search)).await;
|
let _ = launcher.send(pop_launcher::Request::Search(search)).await;
|
||||||
}
|
}
|
||||||
|
|
@ -193,7 +127,19 @@ fn main() {
|
||||||
let _ = launcher.send(pop_launcher::Request::Activate(index)).await;
|
let _ = launcher.send(pop_launcher::Request::Activate(index)).await;
|
||||||
}
|
}
|
||||||
Event::Response(event) => {
|
Event::Response(event) => {
|
||||||
if let pop_launcher::Response::Update(results) = event {
|
if let pop_launcher::Response::Update(mut results) = event {
|
||||||
|
// sort to make comparison with cache easier
|
||||||
|
let mut cached_results = cached_results.as_mut();
|
||||||
|
results.sort_by(|a, b| a.name.cmp(&b.name));
|
||||||
|
// check if cache equals the new polled results
|
||||||
|
// skip if equal
|
||||||
|
if cached_results.len() == results.len() && results.iter().zip(cached_results.iter()).fold(0, |acc, z: (&SearchResult, &SearchResult)| {
|
||||||
|
let (a, b) = z;
|
||||||
|
if a.name == b.name {acc + 1} else {acc}
|
||||||
|
}) == cached_results.len() {
|
||||||
|
continue // skip this update
|
||||||
|
}
|
||||||
|
|
||||||
println!("updating active apps");
|
println!("updating active apps");
|
||||||
let model = window.active_app_model();
|
let model = window.active_app_model();
|
||||||
let model_len = model.n_items();
|
let model_len = model.n_items();
|
||||||
|
|
@ -210,6 +156,7 @@ fn main() {
|
||||||
.map(|v| DockObject::from_search_results(v).upcast())
|
.map(|v| DockObject::from_search_results(v).upcast())
|
||||||
.collect();
|
.collect();
|
||||||
model.splice(0, model_len, &new_results[..]);
|
model.splice(0, model_len, &new_results[..]);
|
||||||
|
cached_results.splice(.., results);
|
||||||
}
|
}
|
||||||
else if let pop_launcher::Response::DesktopEntry {
|
else if let pop_launcher::Response::DesktopEntry {
|
||||||
path,
|
path,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue