working workspaces
This commit is contained in:
parent
9338671070
commit
add25edbdc
9 changed files with 581 additions and 358 deletions
|
|
@ -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<Workspace>> {
|
class WorkspacesController extends StreamNotifier<List<List<Workspace>>> {
|
||||||
@override
|
@override
|
||||||
Stream<List<Workspace>> build() => listenWorkspaces();
|
Stream<List<List<Workspace>>> build() => listenWorkspaces();
|
||||||
|
|
||||||
static final provider =
|
static final provider =
|
||||||
StreamNotifierProvider<WorkspacesController, List<Workspace>>(
|
StreamNotifierProvider<WorkspacesController, List<List<Workspace>>>(
|
||||||
WorkspacesController.new,
|
WorkspacesController.new,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -6,9 +6,9 @@
|
||||||
import '../frb_generated.dart';
|
import '../frb_generated.dart';
|
||||||
import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart';
|
import 'package:flutter_rust_bridge/flutter_rust_bridge_for_generated.dart';
|
||||||
|
|
||||||
// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `clone`
|
// These function are ignored because they are on traits that is not defined in current crate (put an empty `#[frb]` on it to unignore): `clone`, `fmt`
|
||||||
|
|
||||||
Stream<List<Workspace>> listenWorkspaces() =>
|
Stream<List<List<Workspace>>> listenWorkspaces() =>
|
||||||
RustLib.instance.api.crateApiWorkspaceApiListenWorkspaces();
|
RustLib.instance.api.crateApiWorkspaceApiListenWorkspaces();
|
||||||
|
|
||||||
class Workspace {
|
class Workspace {
|
||||||
|
|
|
||||||
|
|
@ -75,7 +75,7 @@ class RustLib extends BaseEntrypoint<RustLibApi, RustLibApiImpl, RustLibWire> {
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract class RustLibApi extends BaseApi {
|
abstract class RustLibApi extends BaseApi {
|
||||||
Stream<List<Workspace>> crateApiWorkspaceApiListenWorkspaces();
|
Stream<List<List<Workspace>>> crateApiWorkspaceApiListenWorkspaces();
|
||||||
}
|
}
|
||||||
|
|
||||||
class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
||||||
|
|
@ -87,14 +87,14 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Stream<List<Workspace>> crateApiWorkspaceApiListenWorkspaces() {
|
Stream<List<List<Workspace>>> crateApiWorkspaceApiListenWorkspaces() {
|
||||||
final sink = RustStreamSink<List<Workspace>>();
|
final sink = RustStreamSink<List<List<Workspace>>>();
|
||||||
unawaited(
|
unawaited(
|
||||||
handler.executeNormal(
|
handler.executeNormal(
|
||||||
NormalTask(
|
NormalTask(
|
||||||
callFfi: (port_) {
|
callFfi: (port_) {
|
||||||
final serializer = SseSerializer(generalizedFrbRustBinding);
|
final serializer = SseSerializer(generalizedFrbRustBinding);
|
||||||
sse_encode_StreamSink_list_workspace_Sse(sink, serializer);
|
sse_encode_StreamSink_list_list_workspace_Sse(sink, serializer);
|
||||||
pdeCallFfi(
|
pdeCallFfi(
|
||||||
generalizedFrbRustBinding,
|
generalizedFrbRustBinding,
|
||||||
serializer,
|
serializer,
|
||||||
|
|
@ -125,9 +125,8 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
||||||
}
|
}
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
RustStreamSink<List<Workspace>> dco_decode_StreamSink_list_workspace_Sse(
|
RustStreamSink<List<List<Workspace>>>
|
||||||
dynamic raw,
|
dco_decode_StreamSink_list_list_workspace_Sse(dynamic raw) {
|
||||||
) {
|
|
||||||
// Codec=Dco (DartCObject based), see doc to use other codecs
|
// Codec=Dco (DartCObject based), see doc to use other codecs
|
||||||
throw UnimplementedError();
|
throw UnimplementedError();
|
||||||
}
|
}
|
||||||
|
|
@ -144,6 +143,12 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
||||||
return raw as bool;
|
return raw as bool;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@protected
|
||||||
|
List<List<Workspace>> dco_decode_list_list_workspace(dynamic raw) {
|
||||||
|
// Codec=Dco (DartCObject based), see doc to use other codecs
|
||||||
|
return (raw as List<dynamic>).map(dco_decode_list_workspace).toList();
|
||||||
|
}
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
Uint8List dco_decode_list_prim_u_8_strict(dynamic raw) {
|
Uint8List dco_decode_list_prim_u_8_strict(dynamic raw) {
|
||||||
// Codec=Dco (DartCObject based), see doc to use other codecs
|
// Codec=Dco (DartCObject based), see doc to use other codecs
|
||||||
|
|
@ -185,9 +190,8 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
||||||
}
|
}
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
RustStreamSink<List<Workspace>> sse_decode_StreamSink_list_workspace_Sse(
|
RustStreamSink<List<List<Workspace>>>
|
||||||
SseDeserializer deserializer,
|
sse_decode_StreamSink_list_list_workspace_Sse(SseDeserializer deserializer) {
|
||||||
) {
|
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
throw UnimplementedError('Unreachable ()');
|
throw UnimplementedError('Unreachable ()');
|
||||||
}
|
}
|
||||||
|
|
@ -205,6 +209,20 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
||||||
return deserializer.buffer.getUint8() != 0;
|
return deserializer.buffer.getUint8() != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@protected
|
||||||
|
List<List<Workspace>> sse_decode_list_list_workspace(
|
||||||
|
SseDeserializer deserializer,
|
||||||
|
) {
|
||||||
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
|
|
||||||
|
var len_ = sse_decode_i_32(deserializer);
|
||||||
|
var ans_ = <List<Workspace>>[];
|
||||||
|
for (var idx_ = 0; idx_ < len_; ++idx_) {
|
||||||
|
ans_.add(sse_decode_list_workspace(deserializer));
|
||||||
|
}
|
||||||
|
return ans_;
|
||||||
|
}
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer) {
|
Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer) {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
|
|
@ -258,15 +276,15 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
||||||
}
|
}
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
void sse_encode_StreamSink_list_workspace_Sse(
|
void sse_encode_StreamSink_list_list_workspace_Sse(
|
||||||
RustStreamSink<List<Workspace>> self,
|
RustStreamSink<List<List<Workspace>>> self,
|
||||||
SseSerializer serializer,
|
SseSerializer serializer,
|
||||||
) {
|
) {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
sse_encode_String(
|
sse_encode_String(
|
||||||
self.setupAndSerialize(
|
self.setupAndSerialize(
|
||||||
codec: SseCodec(
|
codec: SseCodec(
|
||||||
decodeSuccessData: sse_decode_list_workspace,
|
decodeSuccessData: sse_decode_list_list_workspace,
|
||||||
decodeErrorData: sse_decode_AnyhowException,
|
decodeErrorData: sse_decode_AnyhowException,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -286,6 +304,18 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
||||||
serializer.buffer.putUint8(self ? 1 : 0);
|
serializer.buffer.putUint8(self ? 1 : 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@protected
|
||||||
|
void sse_encode_list_list_workspace(
|
||||||
|
List<List<Workspace>> self,
|
||||||
|
SseSerializer serializer,
|
||||||
|
) {
|
||||||
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
|
sse_encode_i_32(self.length, serializer);
|
||||||
|
for (final item in self) {
|
||||||
|
sse_encode_list_workspace(item, serializer);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
void sse_encode_list_prim_u_8_strict(
|
void sse_encode_list_prim_u_8_strict(
|
||||||
Uint8List self,
|
Uint8List self,
|
||||||
|
|
|
||||||
|
|
@ -22,9 +22,8 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
AnyhowException dco_decode_AnyhowException(dynamic raw);
|
AnyhowException dco_decode_AnyhowException(dynamic raw);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
RustStreamSink<List<Workspace>> dco_decode_StreamSink_list_workspace_Sse(
|
RustStreamSink<List<List<Workspace>>>
|
||||||
dynamic raw,
|
dco_decode_StreamSink_list_list_workspace_Sse(dynamic raw);
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
String dco_decode_String(dynamic raw);
|
String dco_decode_String(dynamic raw);
|
||||||
|
|
@ -32,6 +31,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
@protected
|
@protected
|
||||||
bool dco_decode_bool(dynamic raw);
|
bool dco_decode_bool(dynamic raw);
|
||||||
|
|
||||||
|
@protected
|
||||||
|
List<List<Workspace>> dco_decode_list_list_workspace(dynamic raw);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
Uint8List dco_decode_list_prim_u_8_strict(dynamic raw);
|
Uint8List dco_decode_list_prim_u_8_strict(dynamic raw);
|
||||||
|
|
||||||
|
|
@ -51,9 +53,8 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
AnyhowException sse_decode_AnyhowException(SseDeserializer deserializer);
|
AnyhowException sse_decode_AnyhowException(SseDeserializer deserializer);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
RustStreamSink<List<Workspace>> sse_decode_StreamSink_list_workspace_Sse(
|
RustStreamSink<List<List<Workspace>>>
|
||||||
SseDeserializer deserializer,
|
sse_decode_StreamSink_list_list_workspace_Sse(SseDeserializer deserializer);
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
String sse_decode_String(SseDeserializer deserializer);
|
String sse_decode_String(SseDeserializer deserializer);
|
||||||
|
|
@ -61,6 +62,11 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
@protected
|
@protected
|
||||||
bool sse_decode_bool(SseDeserializer deserializer);
|
bool sse_decode_bool(SseDeserializer deserializer);
|
||||||
|
|
||||||
|
@protected
|
||||||
|
List<List<Workspace>> sse_decode_list_list_workspace(
|
||||||
|
SseDeserializer deserializer,
|
||||||
|
);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer);
|
Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer);
|
||||||
|
|
||||||
|
|
@ -86,8 +92,8 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
);
|
);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
void sse_encode_StreamSink_list_workspace_Sse(
|
void sse_encode_StreamSink_list_list_workspace_Sse(
|
||||||
RustStreamSink<List<Workspace>> self,
|
RustStreamSink<List<List<Workspace>>> self,
|
||||||
SseSerializer serializer,
|
SseSerializer serializer,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -97,6 +103,12 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
@protected
|
@protected
|
||||||
void sse_encode_bool(bool self, SseSerializer serializer);
|
void sse_encode_bool(bool self, SseSerializer serializer);
|
||||||
|
|
||||||
|
@protected
|
||||||
|
void sse_encode_list_list_workspace(
|
||||||
|
List<List<Workspace>> self,
|
||||||
|
SseSerializer serializer,
|
||||||
|
);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
void sse_encode_list_prim_u_8_strict(
|
void sse_encode_list_prim_u_8_strict(
|
||||||
Uint8List self,
|
Uint8List self,
|
||||||
|
|
|
||||||
|
|
@ -24,9 +24,8 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
AnyhowException dco_decode_AnyhowException(dynamic raw);
|
AnyhowException dco_decode_AnyhowException(dynamic raw);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
RustStreamSink<List<Workspace>> dco_decode_StreamSink_list_workspace_Sse(
|
RustStreamSink<List<List<Workspace>>>
|
||||||
dynamic raw,
|
dco_decode_StreamSink_list_list_workspace_Sse(dynamic raw);
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
String dco_decode_String(dynamic raw);
|
String dco_decode_String(dynamic raw);
|
||||||
|
|
@ -34,6 +33,9 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
@protected
|
@protected
|
||||||
bool dco_decode_bool(dynamic raw);
|
bool dco_decode_bool(dynamic raw);
|
||||||
|
|
||||||
|
@protected
|
||||||
|
List<List<Workspace>> dco_decode_list_list_workspace(dynamic raw);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
Uint8List dco_decode_list_prim_u_8_strict(dynamic raw);
|
Uint8List dco_decode_list_prim_u_8_strict(dynamic raw);
|
||||||
|
|
||||||
|
|
@ -53,9 +55,8 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
AnyhowException sse_decode_AnyhowException(SseDeserializer deserializer);
|
AnyhowException sse_decode_AnyhowException(SseDeserializer deserializer);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
RustStreamSink<List<Workspace>> sse_decode_StreamSink_list_workspace_Sse(
|
RustStreamSink<List<List<Workspace>>>
|
||||||
SseDeserializer deserializer,
|
sse_decode_StreamSink_list_list_workspace_Sse(SseDeserializer deserializer);
|
||||||
);
|
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
String sse_decode_String(SseDeserializer deserializer);
|
String sse_decode_String(SseDeserializer deserializer);
|
||||||
|
|
@ -63,6 +64,11 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
@protected
|
@protected
|
||||||
bool sse_decode_bool(SseDeserializer deserializer);
|
bool sse_decode_bool(SseDeserializer deserializer);
|
||||||
|
|
||||||
|
@protected
|
||||||
|
List<List<Workspace>> sse_decode_list_list_workspace(
|
||||||
|
SseDeserializer deserializer,
|
||||||
|
);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer);
|
Uint8List sse_decode_list_prim_u_8_strict(SseDeserializer deserializer);
|
||||||
|
|
||||||
|
|
@ -88,8 +94,8 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
);
|
);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
void sse_encode_StreamSink_list_workspace_Sse(
|
void sse_encode_StreamSink_list_list_workspace_Sse(
|
||||||
RustStreamSink<List<Workspace>> self,
|
RustStreamSink<List<List<Workspace>>> self,
|
||||||
SseSerializer serializer,
|
SseSerializer serializer,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -99,6 +105,12 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||||
@protected
|
@protected
|
||||||
void sse_encode_bool(bool self, SseSerializer serializer);
|
void sse_encode_bool(bool self, SseSerializer serializer);
|
||||||
|
|
||||||
|
@protected
|
||||||
|
void sse_encode_list_list_workspace(
|
||||||
|
List<List<Workspace>> self,
|
||||||
|
SseSerializer serializer,
|
||||||
|
);
|
||||||
|
|
||||||
@protected
|
@protected
|
||||||
void sse_encode_list_prim_u_8_strict(
|
void sse_encode_list_prim_u_8_strict(
|
||||||
Uint8List self,
|
Uint8List self,
|
||||||
|
|
|
||||||
|
|
@ -16,29 +16,35 @@ class Bar extends ConsumerWidget {
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
children:
|
children:
|
||||||
[
|
[
|
||||||
ref
|
...ref
|
||||||
.watch(WorkspacesController.provider)
|
.watch(WorkspacesController.provider)
|
||||||
.whenOrNull(
|
.when(
|
||||||
error: (error, stackTrace) => [
|
error: (error, stackTrace) => [Text(error.toString())],
|
||||||
Text(error.toString()),
|
loading: () => [],
|
||||||
],
|
data: (value) => value
|
||||||
data: (value) {
|
|
||||||
return value
|
|
||||||
.map(
|
.map(
|
||||||
(element) => IconButton(
|
(group) => Row(
|
||||||
|
children: group
|
||||||
|
.map(
|
||||||
|
(workspace) => IconButton(
|
||||||
onPressed: () {},
|
onPressed: () {},
|
||||||
icon: Icon(
|
icon: Icon(
|
||||||
element.activated
|
workspace.activated
|
||||||
? Icons.circle
|
? Icons.circle
|
||||||
: Icons.circle_outlined,
|
: Icons.circle_outlined,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
.toList();
|
.toList(),
|
||||||
},
|
),
|
||||||
) ??
|
)
|
||||||
[],
|
.toList(),
|
||||||
[
|
),
|
||||||
|
Center(
|
||||||
|
child: Row(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
children: [
|
||||||
TextButton(
|
TextButton(
|
||||||
onPressed: () {},
|
onPressed: () {},
|
||||||
child: Text(
|
child: Text(
|
||||||
|
|
@ -54,14 +60,23 @@ class Bar extends ConsumerWidget {
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
[
|
),
|
||||||
|
),
|
||||||
|
Row(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
children: [
|
||||||
IconButton(onPressed: () {}, icon: Icon(Icons.wifi)),
|
IconButton(onPressed: () {}, icon: Icon(Icons.wifi)),
|
||||||
IconButton(onPressed: () {}, icon: Icon(Icons.bluetooth)),
|
IconButton(onPressed: () {}, icon: Icon(Icons.bluetooth)),
|
||||||
IconButton(onPressed: () {}, icon: Icon(Icons.volume_off)),
|
IconButton(
|
||||||
|
onPressed: () {},
|
||||||
|
icon: Icon(Icons.volume_off),
|
||||||
|
),
|
||||||
],
|
],
|
||||||
|
),
|
||||||
]
|
]
|
||||||
.map(
|
.map(
|
||||||
(children) => Padding(
|
(child) => Padding(
|
||||||
padding: EdgeInsetsGeometry.directional(bottom: 6),
|
padding: EdgeInsetsGeometry.directional(bottom: 6),
|
||||||
child: Container(
|
child: Container(
|
||||||
height: 42,
|
height: 42,
|
||||||
|
|
@ -72,11 +87,7 @@ class Bar extends ConsumerWidget {
|
||||||
).colorScheme.surfaceContainerLow,
|
).colorScheme.surfaceContainerLow,
|
||||||
borderRadius: BorderRadius.circular(999),
|
borderRadius: BorderRadius.circular(999),
|
||||||
),
|
),
|
||||||
child: Row(
|
child: child,
|
||||||
mainAxisSize: MainAxisSize.min,
|
|
||||||
crossAxisAlignment: CrossAxisAlignment.center,
|
|
||||||
children: children,
|
|
||||||
),
|
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
|
||||||
|
|
@ -4,12 +4,12 @@ use std::collections::HashMap;
|
||||||
use crate::{frb_generated::StreamSink, internal::wayland::AppState};
|
use crate::{frb_generated::StreamSink, internal::wayland::AppState};
|
||||||
|
|
||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone, Debug)]
|
||||||
pub struct Workspace {
|
pub struct Workspace {
|
||||||
pub activated: bool,
|
pub activated: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn listen_workspaces(sink: StreamSink<Vec<Workspace>>) -> 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");
|
||||||
|
|
||||||
|
|
@ -18,6 +18,8 @@ pub fn listen_workspaces(sink: StreamSink<Vec<Workspace>>) -> Result<()> {
|
||||||
|
|
||||||
let mut state = AppState {
|
let mut state = AppState {
|
||||||
workspaces: HashMap::new(),
|
workspaces: HashMap::new(),
|
||||||
|
workspace_group: HashMap::new(),
|
||||||
|
workspace_coords: HashMap::new(),
|
||||||
sink,
|
sink,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -25,9 +25,9 @@ clippy::needless_borrow
|
||||||
|
|
||||||
// Section: imports
|
// Section: imports
|
||||||
|
|
||||||
|
use flutter_rust_bridge::for_generated::byteorder::{NativeEndian, ReadBytesExt, WriteBytesExt};
|
||||||
|
use flutter_rust_bridge::for_generated::{transform_result_dco, Lifetimeable, Lockable};
|
||||||
use flutter_rust_bridge::{Handler, IntoIntoDart};
|
use flutter_rust_bridge::{Handler, IntoIntoDart};
|
||||||
use flutter_rust_bridge::for_generated::{Lockable, transform_result_dco, Lifetimeable};
|
|
||||||
use flutter_rust_bridge::for_generated::byteorder::{NativeEndian, WriteBytesExt, ReadBytesExt};
|
|
||||||
|
|
||||||
// Section: boilerplate
|
// Section: boilerplate
|
||||||
|
|
||||||
|
|
@ -39,69 +39,134 @@ flutter_rust_bridge::frb_generated_boilerplate!(
|
||||||
pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_VERSION: &str = "2.11.1";
|
pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_VERSION: &str = "2.11.1";
|
||||||
pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH: i32 = 1397669831;
|
pub(crate) const FLUTTER_RUST_BRIDGE_CODEGEN_CONTENT_HASH: i32 = 1397669831;
|
||||||
|
|
||||||
|
|
||||||
// Section: executor
|
// Section: executor
|
||||||
|
|
||||||
flutter_rust_bridge::frb_generated_default_handler!();
|
flutter_rust_bridge::frb_generated_default_handler!();
|
||||||
|
|
||||||
// Section: wire_funcs
|
// Section: wire_funcs
|
||||||
|
|
||||||
fn wire__crate__api__workspace_api__listen_workspaces_impl(port_: flutter_rust_bridge::for_generated::MessagePort,ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr,rust_vec_len_: i32,data_len_: i32) {
|
fn wire__crate__api__workspace_api__listen_workspaces_impl(
|
||||||
FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::<flutter_rust_bridge::for_generated::SseCodec,_,_>(flutter_rust_bridge::for_generated::TaskInfo{ debug_name: "listen_workspaces", port: Some(port_), mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal }, move || {
|
port_: flutter_rust_bridge::for_generated::MessagePort,
|
||||||
let message = unsafe { flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire(ptr_, rust_vec_len_, data_len_) };
|
ptr_: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr,
|
||||||
let mut deserializer = flutter_rust_bridge::for_generated::SseDeserializer::new(message);
|
rust_vec_len_: i32,
|
||||||
let api_sink = <StreamSink<Vec<crate::api::workspace_api::Workspace>,flutter_rust_bridge::for_generated::SseCodec>>::sse_decode(&mut deserializer);deserializer.end(); move |context| {
|
data_len_: i32,
|
||||||
transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>((move || {
|
) {
|
||||||
let output_ok = crate::api::workspace_api::listen_workspaces(api_sink)?; Ok(output_ok)
|
FLUTTER_RUST_BRIDGE_HANDLER.wrap_normal::<flutter_rust_bridge::for_generated::SseCodec, _, _>(
|
||||||
})())
|
flutter_rust_bridge::for_generated::TaskInfo {
|
||||||
} })
|
debug_name: "listen_workspaces",
|
||||||
|
port: Some(port_),
|
||||||
|
mode: flutter_rust_bridge::for_generated::FfiCallMode::Normal,
|
||||||
|
},
|
||||||
|
move || {
|
||||||
|
let message = unsafe {
|
||||||
|
flutter_rust_bridge::for_generated::Dart2RustMessageSse::from_wire(
|
||||||
|
ptr_,
|
||||||
|
rust_vec_len_,
|
||||||
|
data_len_,
|
||||||
|
)
|
||||||
|
};
|
||||||
|
let mut deserializer =
|
||||||
|
flutter_rust_bridge::for_generated::SseDeserializer::new(message);
|
||||||
|
let api_sink = <StreamSink<
|
||||||
|
Vec<Vec<crate::api::workspace_api::Workspace>>,
|
||||||
|
flutter_rust_bridge::for_generated::SseCodec,
|
||||||
|
>>::sse_decode(&mut deserializer);
|
||||||
|
deserializer.end();
|
||||||
|
move |context| {
|
||||||
|
transform_result_sse::<_, flutter_rust_bridge::for_generated::anyhow::Error>(
|
||||||
|
(move || {
|
||||||
|
let output_ok = crate::api::workspace_api::listen_workspaces(api_sink)?;
|
||||||
|
Ok(output_ok)
|
||||||
|
})(),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Section: dart2rust
|
// Section: dart2rust
|
||||||
|
|
||||||
|
|
||||||
impl SseDecode for flutter_rust_bridge::for_generated::anyhow::Error {
|
impl SseDecode for flutter_rust_bridge::for_generated::anyhow::Error {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {let mut inner = <String>::sse_decode(deserializer);
|
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
|
||||||
return flutter_rust_bridge::for_generated::anyhow::anyhow!("{}", inner);}
|
let mut inner = <String>::sse_decode(deserializer);
|
||||||
|
return flutter_rust_bridge::for_generated::anyhow::anyhow!("{}", inner);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SseDecode for StreamSink<Vec<crate::api::workspace_api::Workspace>,flutter_rust_bridge::for_generated::SseCodec> {
|
impl SseDecode
|
||||||
|
for StreamSink<
|
||||||
|
Vec<Vec<crate::api::workspace_api::Workspace>>,
|
||||||
|
flutter_rust_bridge::for_generated::SseCodec,
|
||||||
|
>
|
||||||
|
{
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {let mut inner = <String>::sse_decode(deserializer);
|
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
|
||||||
return StreamSink::deserialize(inner);}
|
let mut inner = <String>::sse_decode(deserializer);
|
||||||
|
return StreamSink::deserialize(inner);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SseDecode for String {
|
impl SseDecode for String {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {let mut inner = <Vec<u8>>::sse_decode(deserializer);
|
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
|
||||||
return String::from_utf8(inner).unwrap();}
|
let mut inner = <Vec<u8>>::sse_decode(deserializer);
|
||||||
|
return String::from_utf8(inner).unwrap();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SseDecode for bool {
|
impl SseDecode for bool {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {deserializer.cursor.read_u8().unwrap() != 0}
|
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
|
||||||
|
deserializer.cursor.read_u8().unwrap() != 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl SseDecode for Vec<Vec<crate::api::workspace_api::Workspace>> {
|
||||||
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
|
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
|
||||||
|
let mut len_ = <i32>::sse_decode(deserializer);
|
||||||
|
let mut ans_ = vec![];
|
||||||
|
for idx_ in 0..len_ {
|
||||||
|
ans_.push(<Vec<crate::api::workspace_api::Workspace>>::sse_decode(
|
||||||
|
deserializer,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
return ans_;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SseDecode for Vec<u8> {
|
impl SseDecode for Vec<u8> {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {let mut len_ = <i32>::sse_decode(deserializer);
|
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
|
||||||
|
let mut len_ = <i32>::sse_decode(deserializer);
|
||||||
let mut ans_ = vec![];
|
let mut ans_ = vec![];
|
||||||
for idx_ in 0..len_ { ans_.push(<u8>::sse_decode(deserializer)); }
|
for idx_ in 0..len_ {
|
||||||
return ans_;}
|
ans_.push(<u8>::sse_decode(deserializer));
|
||||||
|
}
|
||||||
|
return ans_;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SseDecode for Vec<crate::api::workspace_api::Workspace> {
|
impl SseDecode for Vec<crate::api::workspace_api::Workspace> {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {let mut len_ = <i32>::sse_decode(deserializer);
|
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
|
||||||
|
let mut len_ = <i32>::sse_decode(deserializer);
|
||||||
let mut ans_ = vec![];
|
let mut ans_ = vec![];
|
||||||
for idx_ in 0..len_ { ans_.push(<crate::api::workspace_api::Workspace>::sse_decode(deserializer)); }
|
for idx_ in 0..len_ {
|
||||||
return ans_;}
|
ans_.push(<crate::api::workspace_api::Workspace>::sse_decode(
|
||||||
|
deserializer,
|
||||||
|
));
|
||||||
|
}
|
||||||
|
return ans_;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SseDecode for u8 {
|
impl SseDecode for u8 {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {deserializer.cursor.read_u8().unwrap()}
|
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
|
||||||
|
deserializer.cursor.read_u8().unwrap()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SseDecode for () {
|
impl SseDecode for () {
|
||||||
|
|
@ -111,24 +176,36 @@ fn wire__crate__api__workspace_api__listen_workspaces_impl(port_: flutter_rust_b
|
||||||
|
|
||||||
impl SseDecode for crate::api::workspace_api::Workspace {
|
impl SseDecode for crate::api::workspace_api::Workspace {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {let mut var_activated = <bool>::sse_decode(deserializer);
|
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
|
||||||
return crate::api::workspace_api::Workspace{activated: var_activated};}
|
let mut var_activated = <bool>::sse_decode(deserializer);
|
||||||
|
return crate::api::workspace_api::Workspace {
|
||||||
|
activated: var_activated,
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SseDecode for i32 {
|
impl SseDecode for i32 {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {deserializer.cursor.read_i32::<NativeEndian>().unwrap()}
|
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
|
||||||
|
deserializer.cursor.read_i32::<NativeEndian>().unwrap()
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn pde_ffi_dispatcher_primary_impl(
|
fn pde_ffi_dispatcher_primary_impl(
|
||||||
func_id: i32,port: flutter_rust_bridge::for_generated::MessagePort,
|
func_id: i32,
|
||||||
|
port: flutter_rust_bridge::for_generated::MessagePort,
|
||||||
ptr: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr,
|
ptr: flutter_rust_bridge::for_generated::PlatformGeneralizedUint8ListPtr,
|
||||||
rust_vec_len: i32,
|
rust_vec_len: i32,
|
||||||
data_len: i32,
|
data_len: i32,
|
||||||
) {
|
) {
|
||||||
// Codec=Pde (Serialization + dispatch), see doc to use other codecs
|
// Codec=Pde (Serialization + dispatch), see doc to use other codecs
|
||||||
match func_id {
|
match func_id {
|
||||||
1 => wire__crate__api__workspace_api__listen_workspaces_impl(port, ptr, rust_vec_len, data_len),
|
1 => wire__crate__api__workspace_api__listen_workspaces_impl(
|
||||||
|
port,
|
||||||
|
ptr,
|
||||||
|
rust_vec_len,
|
||||||
|
data_len,
|
||||||
|
),
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -141,24 +218,25 @@ return crate::api::workspace_api::Workspace{activated: var_activated};}
|
||||||
) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse {
|
) -> flutter_rust_bridge::for_generated::WireSyncRust2DartSse {
|
||||||
// Codec=Pde (Serialization + dispatch), see doc to use other codecs
|
// Codec=Pde (Serialization + dispatch), see doc to use other codecs
|
||||||
match func_id {
|
match func_id {
|
||||||
|
|
||||||
_ => unreachable!(),
|
_ => unreachable!(),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Section: rust2dart
|
// Section: rust2dart
|
||||||
|
|
||||||
// Codec=Dco (DartCObject based), see doc to use other codecs
|
// Codec=Dco (DartCObject based), see doc to use other codecs
|
||||||
impl flutter_rust_bridge::IntoDart for crate::api::workspace_api::Workspace {
|
impl flutter_rust_bridge::IntoDart for crate::api::workspace_api::Workspace {
|
||||||
fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi {
|
fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi {
|
||||||
[
|
[self.activated.into_into_dart().into_dart()].into_dart()
|
||||||
self.activated.into_into_dart().into_dart()
|
|
||||||
].into_dart()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for crate::api::workspace_api::Workspace {}
|
impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive
|
||||||
impl flutter_rust_bridge::IntoIntoDart<crate::api::workspace_api::Workspace> for crate::api::workspace_api::Workspace {
|
for crate::api::workspace_api::Workspace
|
||||||
|
{
|
||||||
|
}
|
||||||
|
impl flutter_rust_bridge::IntoIntoDart<crate::api::workspace_api::Workspace>
|
||||||
|
for crate::api::workspace_api::Workspace
|
||||||
|
{
|
||||||
fn into_into_dart(self) -> crate::api::workspace_api::Workspace {
|
fn into_into_dart(self) -> crate::api::workspace_api::Workspace {
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
@ -166,39 +244,72 @@ impl flutter_rust_bridge::IntoIntoDart<crate::api::workspace_api::Workspace> for
|
||||||
|
|
||||||
impl SseEncode for flutter_rust_bridge::for_generated::anyhow::Error {
|
impl SseEncode for flutter_rust_bridge::for_generated::anyhow::Error {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {<String>::sse_encode(format!("{:?}", self), serializer);}
|
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
|
||||||
|
<String>::sse_encode(format!("{:?}", self), serializer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SseEncode for StreamSink<Vec<crate::api::workspace_api::Workspace>,flutter_rust_bridge::for_generated::SseCodec> {
|
impl SseEncode
|
||||||
|
for StreamSink<
|
||||||
|
Vec<Vec<crate::api::workspace_api::Workspace>>,
|
||||||
|
flutter_rust_bridge::for_generated::SseCodec,
|
||||||
|
>
|
||||||
|
{
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {unimplemented!("")}
|
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
|
||||||
|
unimplemented!("")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SseEncode for String {
|
impl SseEncode for String {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {<Vec<u8>>::sse_encode(self.into_bytes(), serializer);}
|
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
|
||||||
|
<Vec<u8>>::sse_encode(self.into_bytes(), serializer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SseEncode for bool {
|
impl SseEncode for bool {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {serializer.cursor.write_u8(self as _).unwrap();}
|
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
|
||||||
|
serializer.cursor.write_u8(self as _).unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl SseEncode for Vec<Vec<crate::api::workspace_api::Workspace>> {
|
||||||
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
|
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
|
||||||
|
<i32>::sse_encode(self.len() as _, serializer);
|
||||||
|
for item in self {
|
||||||
|
<Vec<crate::api::workspace_api::Workspace>>::sse_encode(item, serializer);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SseEncode for Vec<u8> {
|
impl SseEncode for Vec<u8> {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {<i32>::sse_encode(self.len() as _, serializer);
|
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
|
||||||
for item in self { <u8>::sse_encode(item, serializer); }}
|
<i32>::sse_encode(self.len() as _, serializer);
|
||||||
|
for item in self {
|
||||||
|
<u8>::sse_encode(item, serializer);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SseEncode for Vec<crate::api::workspace_api::Workspace> {
|
impl SseEncode for Vec<crate::api::workspace_api::Workspace> {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {<i32>::sse_encode(self.len() as _, serializer);
|
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
|
||||||
for item in self { <crate::api::workspace_api::Workspace>::sse_encode(item, serializer); }}
|
<i32>::sse_encode(self.len() as _, serializer);
|
||||||
|
for item in self {
|
||||||
|
<crate::api::workspace_api::Workspace>::sse_encode(item, serializer);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SseEncode for u8 {
|
impl SseEncode for u8 {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {serializer.cursor.write_u8(self).unwrap();}
|
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
|
||||||
|
serializer.cursor.write_u8(self).unwrap();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SseEncode for () {
|
impl SseEncode for () {
|
||||||
|
|
@ -208,64 +319,59 @@ impl flutter_rust_bridge::IntoIntoDart<crate::api::workspace_api::Workspace> for
|
||||||
|
|
||||||
impl SseEncode for crate::api::workspace_api::Workspace {
|
impl SseEncode for crate::api::workspace_api::Workspace {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {<bool>::sse_encode(self.activated, serializer);}
|
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
|
||||||
|
<bool>::sse_encode(self.activated, serializer);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl SseEncode for i32 {
|
impl SseEncode for i32 {
|
||||||
// Codec=Sse (Serialization based), see doc to use other codecs
|
// Codec=Sse (Serialization based), see doc to use other codecs
|
||||||
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {serializer.cursor.write_i32::<NativeEndian>(self).unwrap();}
|
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
|
||||||
|
serializer.cursor.write_i32::<NativeEndian>(self).unwrap();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#[cfg(not(target_family = "wasm"))]
|
#[cfg(not(target_family = "wasm"))]
|
||||||
mod io {
|
mod io {
|
||||||
// This file is automatically generated, so please do not edit it.
|
// This file is automatically generated, so please do not edit it.
|
||||||
// @generated by `flutter_rust_bridge`@ 2.11.1.
|
// @generated by `flutter_rust_bridge`@ 2.11.1.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Section: imports
|
// Section: imports
|
||||||
|
|
||||||
|
use super::*;
|
||||||
|
use flutter_rust_bridge::for_generated::byteorder::{
|
||||||
|
NativeEndian, ReadBytesExt, WriteBytesExt,
|
||||||
|
};
|
||||||
|
use flutter_rust_bridge::for_generated::{transform_result_dco, Lifetimeable, Lockable};
|
||||||
use flutter_rust_bridge::{Handler, IntoIntoDart};
|
use flutter_rust_bridge::{Handler, IntoIntoDart};
|
||||||
use flutter_rust_bridge::for_generated::{Lockable, transform_result_dco, Lifetimeable};
|
|
||||||
use flutter_rust_bridge::for_generated::byteorder::{NativeEndian, WriteBytesExt, ReadBytesExt};use super::*;
|
|
||||||
|
|
||||||
// Section: boilerplate
|
// Section: boilerplate
|
||||||
|
|
||||||
flutter_rust_bridge::frb_generated_boilerplate_io!();
|
flutter_rust_bridge::frb_generated_boilerplate_io!();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
#[cfg(not(target_family = "wasm"))]
|
#[cfg(not(target_family = "wasm"))]
|
||||||
pub use io::*;
|
pub use io::*;
|
||||||
|
|
||||||
|
|
||||||
/// cbindgen:ignore
|
/// cbindgen:ignore
|
||||||
#[cfg(target_family = "wasm")]
|
#[cfg(target_family = "wasm")]
|
||||||
mod web {
|
mod web {
|
||||||
// This file is automatically generated, so please do not edit it.
|
// This file is automatically generated, so please do not edit it.
|
||||||
// @generated by `flutter_rust_bridge`@ 2.11.1.
|
// @generated by `flutter_rust_bridge`@ 2.11.1.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// Section: imports
|
// Section: imports
|
||||||
|
|
||||||
use flutter_rust_bridge::{Handler, IntoIntoDart};
|
use super::*;
|
||||||
use flutter_rust_bridge::for_generated::{Lockable, transform_result_dco, Lifetimeable};
|
use flutter_rust_bridge::for_generated::byteorder::{
|
||||||
use flutter_rust_bridge::for_generated::byteorder::{NativeEndian, WriteBytesExt, ReadBytesExt};use super::*;
|
NativeEndian, ReadBytesExt, WriteBytesExt,
|
||||||
|
};
|
||||||
use flutter_rust_bridge::for_generated::wasm_bindgen;
|
use flutter_rust_bridge::for_generated::wasm_bindgen;
|
||||||
use flutter_rust_bridge::for_generated::wasm_bindgen::prelude::*;
|
use flutter_rust_bridge::for_generated::wasm_bindgen::prelude::*;
|
||||||
|
use flutter_rust_bridge::for_generated::{transform_result_dco, Lifetimeable, Lockable};
|
||||||
|
use flutter_rust_bridge::{Handler, IntoIntoDart};
|
||||||
|
|
||||||
// Section: boilerplate
|
// Section: boilerplate
|
||||||
|
|
||||||
flutter_rust_bridge::frb_generated_boilerplate_web!();
|
flutter_rust_bridge::frb_generated_boilerplate_web!();
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
#[cfg(target_family = "wasm")]
|
#[cfg(target_family = "wasm")]
|
||||||
pub use web::*;
|
pub use web::*;
|
||||||
|
|
||||||
|
|
@ -2,37 +2,61 @@ use crate::{frb_generated::StreamSink, workspace_api::Workspace};
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
|
||||||
use wayland_client::{
|
use wayland_client::{
|
||||||
self, Connection, Dispatch, QueueHandle, backend::ObjectId, event_created_child, protocol::wl_registry
|
self, backend::ObjectId, Proxy, Connection, Dispatch, QueueHandle, event_created_child,
|
||||||
|
protocol::wl_registry,
|
||||||
};
|
};
|
||||||
|
|
||||||
use wayland_protocols::ext::workspace::v1::client::{
|
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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// ------------------------
|
||||||
|
// App State
|
||||||
|
// ------------------------
|
||||||
|
|
||||||
pub struct AppState {
|
pub struct AppState {
|
||||||
pub workspaces: HashMap<ObjectId, Workspace>,
|
pub workspaces: HashMap<ObjectId, Workspace>,
|
||||||
pub sink: StreamSink<Vec<Workspace>>,
|
pub workspace_group: HashMap<ObjectId, ObjectId>, // workspace -> group
|
||||||
|
pub workspace_coords: HashMap<ObjectId, (u8, u8)>,
|
||||||
|
pub sink: StreamSink<Vec<Vec<Workspace>>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl AppState {
|
impl AppState {
|
||||||
fn emit(&self) {
|
fn emit(&self) {
|
||||||
let mut entries: Vec<(&ObjectId, &Workspace)> = self.workspaces.iter().collect();
|
let mut groups: HashMap<ObjectId, Vec<(&ObjectId, &Workspace)>> = HashMap::new();
|
||||||
|
|
||||||
entries.sort_by_key(
|
for (ws_id, ws) in &self.workspaces {
|
||||||
|entry: &(&ObjectId, &Workspace)| -> u32 {
|
if let Some(group_id) = self.workspace_group.get(ws_id) {
|
||||||
entry.0.protocol_id()
|
groups
|
||||||
},
|
.entry(group_id.clone())
|
||||||
);
|
.or_insert_with(Vec::new)
|
||||||
|
.push((ws_id, ws));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
let sorted: Vec<Workspace> = entries
|
let mut grouped: Vec<(ObjectId, Vec<(&ObjectId, &Workspace)>)> =
|
||||||
|
groups.into_iter().collect();
|
||||||
|
|
||||||
|
grouped.sort_by_key(|(group_id, _)| group_id.protocol_id());
|
||||||
|
|
||||||
|
let result: Vec<Vec<Workspace>> = grouped
|
||||||
.into_iter()
|
.into_iter()
|
||||||
.map(
|
.map(|(_, mut entries)| {
|
||||||
|entry: (&ObjectId, &Workspace)| -> Workspace {
|
entries.sort_by_key(|(id, _)| {
|
||||||
entry.1.clone()
|
self.workspace_coords
|
||||||
},
|
.get(id)
|
||||||
)
|
.copied()
|
||||||
|
.unwrap_or((0, 0))
|
||||||
|
});
|
||||||
|
|
||||||
|
entries
|
||||||
|
.into_iter()
|
||||||
|
.map(|(_, ws)| ws.clone())
|
||||||
|
.collect()
|
||||||
|
})
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
let _ = self.sink.add(sorted);
|
let _ = self.sink.add(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -71,18 +95,17 @@ impl Dispatch<ext_workspace_manager_v1::ExtWorkspaceManagerV1, ()> for AppState
|
||||||
_data: &(),
|
_data: &(),
|
||||||
_conn: &Connection,
|
_conn: &Connection,
|
||||||
_qh: &QueueHandle<Self>,
|
_qh: &QueueHandle<Self>,
|
||||||
) {
|
) {}
|
||||||
}
|
|
||||||
|
|
||||||
event_created_child!(
|
event_created_child!(
|
||||||
AppState,
|
AppState,
|
||||||
ext_workspace_manager_v1::ExtWorkspaceManagerV1,
|
ext_workspace_manager_v1::ExtWorkspaceManagerV1,
|
||||||
[
|
[
|
||||||
wayland_protocols::ext::workspace::v1::client::ext_workspace_manager_v1::EVT_WORKSPACE_GROUP_OPCODE => (
|
ext_workspace_manager_v1::EVT_WORKSPACE_GROUP_OPCODE => (
|
||||||
ext_workspace_group_handle_v1::ExtWorkspaceGroupHandleV1,
|
ext_workspace_group_handle_v1::ExtWorkspaceGroupHandleV1,
|
||||||
()
|
()
|
||||||
),
|
),
|
||||||
wayland_protocols::ext::workspace::v1::client::ext_workspace_manager_v1::EVT_WORKSPACE_OPCODE => (
|
ext_workspace_manager_v1::EVT_WORKSPACE_OPCODE => (
|
||||||
ext_workspace_handle_v1::ExtWorkspaceHandleV1,
|
ext_workspace_handle_v1::ExtWorkspaceHandleV1,
|
||||||
()
|
()
|
||||||
)
|
)
|
||||||
|
|
@ -90,7 +113,6 @@ impl Dispatch<ext_workspace_manager_v1::ExtWorkspaceManagerV1, ()> for AppState
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
use wayland_client::Proxy;
|
|
||||||
impl Dispatch<ext_workspace_handle_v1::ExtWorkspaceHandleV1, ()> for AppState {
|
impl Dispatch<ext_workspace_handle_v1::ExtWorkspaceHandleV1, ()> for AppState {
|
||||||
fn event(
|
fn event(
|
||||||
state: &mut Self,
|
state: &mut Self,
|
||||||
|
|
@ -100,12 +122,25 @@ impl Dispatch<ext_workspace_handle_v1::ExtWorkspaceHandleV1, ()> for AppState {
|
||||||
_conn: &Connection,
|
_conn: &Connection,
|
||||||
_qh: &QueueHandle<Self>,
|
_qh: &QueueHandle<Self>,
|
||||||
) {
|
) {
|
||||||
match event {
|
let id = proxy.id();
|
||||||
ext_workspace_handle_v1::Event::Id { id: _ } => {
|
|
||||||
|
match event {
|
||||||
|
ext_workspace_handle_v1::Event::Id { .. } => {
|
||||||
|
state.workspaces.insert(
|
||||||
|
id,
|
||||||
|
Workspace { activated: false },
|
||||||
|
);
|
||||||
|
|
||||||
|
state.emit();
|
||||||
|
}
|
||||||
|
|
||||||
|
ext_workspace_handle_v1::Event::Coordinates { coordinates } => {
|
||||||
|
let id = proxy.id();
|
||||||
|
|
||||||
|
if coordinates.len() >= 2 {
|
||||||
|
state.workspace_coords.insert(id, (coordinates[0], coordinates[1]));
|
||||||
|
}
|
||||||
|
|
||||||
state
|
|
||||||
.workspaces
|
|
||||||
.insert(proxy.id(), Workspace { activated: false });
|
|
||||||
state.emit();
|
state.emit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -115,8 +150,6 @@ impl Dispatch<ext_workspace_handle_v1::ExtWorkspaceHandleV1, ()> for AppState {
|
||||||
wayland_client::WEnum::Value(ext_workspace_handle_v1::State::Active)
|
wayland_client::WEnum::Value(ext_workspace_handle_v1::State::Active)
|
||||||
);
|
);
|
||||||
|
|
||||||
let id = proxy.id();
|
|
||||||
|
|
||||||
if let Some(ws) = state.workspaces.get_mut(&id) {
|
if let Some(ws) = state.workspaces.get_mut(&id) {
|
||||||
ws.activated = active;
|
ws.activated = active;
|
||||||
}
|
}
|
||||||
|
|
@ -125,7 +158,8 @@ impl Dispatch<ext_workspace_handle_v1::ExtWorkspaceHandleV1, ()> for AppState {
|
||||||
}
|
}
|
||||||
|
|
||||||
ext_workspace_handle_v1::Event::Removed => {
|
ext_workspace_handle_v1::Event::Removed => {
|
||||||
state.workspaces.remove(&proxy.id());
|
state.workspaces.remove(&id);
|
||||||
|
state.workspace_group.remove(&id);
|
||||||
state.emit();
|
state.emit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -136,13 +170,29 @@ impl Dispatch<ext_workspace_handle_v1::ExtWorkspaceHandleV1, ()> for AppState {
|
||||||
|
|
||||||
impl Dispatch<ext_workspace_group_handle_v1::ExtWorkspaceGroupHandleV1, ()> for AppState {
|
impl Dispatch<ext_workspace_group_handle_v1::ExtWorkspaceGroupHandleV1, ()> for AppState {
|
||||||
fn event(
|
fn event(
|
||||||
_state: &mut Self,
|
state: &mut Self,
|
||||||
_proxy: &ext_workspace_group_handle_v1::ExtWorkspaceGroupHandleV1,
|
proxy: &ext_workspace_group_handle_v1::ExtWorkspaceGroupHandleV1,
|
||||||
_event: ext_workspace_group_handle_v1::Event,
|
event: ext_workspace_group_handle_v1::Event,
|
||||||
_data: &(),
|
_data: &(),
|
||||||
_conn: &Connection,
|
_conn: &Connection,
|
||||||
_qh: &QueueHandle<Self>,
|
_qh: &QueueHandle<Self>,
|
||||||
) {
|
) {
|
||||||
// println!("workspace GROUP event: {:?}", event);
|
let group_id = proxy.id();
|
||||||
|
|
||||||
|
match event {
|
||||||
|
ext_workspace_group_handle_v1::Event::WorkspaceEnter { workspace } => {
|
||||||
|
state
|
||||||
|
.workspace_group
|
||||||
|
.insert(workspace.id(), group_id);
|
||||||
|
state.emit();
|
||||||
|
}
|
||||||
|
|
||||||
|
ext_workspace_group_handle_v1::Event::WorkspaceLeave { workspace } => {
|
||||||
|
state.workspace_group.remove(&workspace.id());
|
||||||
|
state.emit();
|
||||||
|
}
|
||||||
|
|
||||||
|
_ => {}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue