merge workspace and workspaceDTO

This commit is contained in:
Henry Hiles 2026-04-20 14:10:58 -04:00
commit d37ef516f3
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
3 changed files with 17 additions and 23 deletions

View file

@ -1,12 +1,12 @@
import "package:flight/src/rust/api/workspace_api.dart"; import "package:flight/src/rust/api/workspace_api.dart";
import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:flutter_riverpod/flutter_riverpod.dart";
class WorkspacesController extends StreamNotifier<List<List<WorkspaceDto>>> { class WorkspacesController extends StreamNotifier<List<List<Workspace>>> {
@override @override
Stream<List<List<WorkspaceDto>>> build() => listenWorkspaces(); Stream<List<List<Workspace>>> build() => listenWorkspaces();
static final provider = static final provider =
StreamNotifierProvider<WorkspacesController, List<List<WorkspaceDto>>>( StreamNotifierProvider<WorkspacesController, List<List<Workspace>>>(
WorkspacesController.new, WorkspacesController.new,
); );
} }

View file

@ -8,21 +8,22 @@ use wayland_protocols::ext::workspace::v1::client::{
}; };
#[derive(Clone)] #[derive(Clone)]
pub struct WorkspaceDto { pub struct Workspace {
pub activated: bool, pub activated: bool,
pub id: u32, pub id: u32,
pub coords: Option<(u8, u8)>,
pub handle: RustAutoOpaqueNom<ExtWorkspaceHandleV1>, pub handle: RustAutoOpaqueNom<ExtWorkspaceHandleV1>,
pub manager_handle: RustAutoOpaqueNom<ExtWorkspaceManagerV1>, pub manager_handle: RustAutoOpaqueNom<ExtWorkspaceManagerV1>,
} }
impl WorkspaceDto { impl Workspace {
pub fn activate(&self) { pub fn activate(&self) {
self.handle.try_read().unwrap().clone().activate(); self.handle.try_read().unwrap().clone().activate();
self.manager_handle.try_read().unwrap().clone().commit(); self.manager_handle.try_read().unwrap().clone().commit();
} }
} }
pub fn listen_workspaces(sink: StreamSink<Vec<Vec<WorkspaceDto>>>) -> Result<()> { pub fn listen_workspaces(sink: StreamSink<Vec<Vec<Workspace>>>) -> Result<()> {
std::thread::spawn(move || { std::thread::spawn(move || {
let conn = Connection::connect_to_env().expect("Failed to connect to Wayland"); let conn = Connection::connect_to_env().expect("Failed to connect to Wayland");
@ -44,5 +45,5 @@ pub fn listen_workspaces(sink: StreamSink<Vec<Vec<WorkspaceDto>>>) -> Result<()>
} }
}); });
Ok(()) // Return struct with stream?bb Ok(())
} }

View file

@ -1,4 +1,4 @@
use crate::{frb_generated::StreamSink, workspace_api::WorkspaceDto}; use crate::{frb_generated::StreamSink, workspace_api::Workspace};
use std::collections::HashMap; use std::collections::HashMap;
use flutter_rust_bridge::RustAutoOpaqueNom; use flutter_rust_bridge::RustAutoOpaqueNom;
@ -10,15 +10,10 @@ use wayland_protocols::ext::workspace::v1::client::{
ext_workspace_group_handle_v1, ext_workspace_handle_v1, ext_workspace_manager_v1, ext_workspace_group_handle_v1, ext_workspace_handle_v1, ext_workspace_manager_v1,
}; };
pub struct Workspace {
pub dto: WorkspaceDto,
pub coords: Option<(u8, u8)>,
}
pub struct AppState { pub struct AppState {
pub workspaces: HashMap<u32, Workspace>, pub workspaces: HashMap<u32, Workspace>,
pub workspace_group: HashMap<u32, u32>, pub workspace_group: HashMap<u32, u32>,
pub sink: StreamSink<Vec<Vec<WorkspaceDto>>>, pub sink: StreamSink<Vec<Vec<Workspace>>>,
} }
impl AppState { impl AppState {
@ -43,11 +38,11 @@ impl AppState {
.map(|(_, mut entries)| { .map(|(_, mut entries)| {
entries.sort_by_key(|(_, value)| value.coords); entries.sort_by_key(|(_, value)| value.coords);
entries.into_iter().map(|(_, ws)| ws.dto.clone()).collect() entries.into_iter().map(|(_, ws)| ws.clone()).collect()
}) })
.collect(); .collect();
let _ = self.sink.add(result); self.sink.add(result).expect("Updating stream failed");
} }
} }
@ -92,12 +87,10 @@ impl Dispatch<ext_workspace_manager_v1::ExtWorkspaceManagerV1, ()> for AppState
state.workspaces.insert( state.workspaces.insert(
workspace.id().protocol_id().clone(), workspace.id().protocol_id().clone(),
Workspace { Workspace {
dto: WorkspaceDto { activated: false,
activated: false, id: workspace.id().protocol_id(),
id: workspace.id().protocol_id(), handle: RustAutoOpaqueNom::new(workspace.clone()),
handle: RustAutoOpaqueNom::new(workspace.clone()), manager_handle: RustAutoOpaqueNom::new(proxy.clone()),
manager_handle: RustAutoOpaqueNom::new(proxy.clone()),
},
coords: None, coords: None,
}, },
); );
@ -155,7 +148,7 @@ impl Dispatch<ext_workspace_handle_v1::ExtWorkspaceHandleV1, ()> for AppState {
); );
if let Some(ws) = state.workspaces.get_mut(&id.protocol_id()) { if let Some(ws) = state.workspaces.get_mut(&id.protocol_id()) {
ws.dto.activated = active; ws.activated = active;
} }
state.emit(); state.emit();