Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Set proper display size when headless mode is not active #35

Merged
merged 1 commit into from
Jun 29, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 15 additions & 8 deletions lib/feature/display/cubit/display_cubit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,8 @@ class DisplayCubit extends Cubit<DisplayState> with Logger {
_subscribeToTransportStream();

if (state is DisplayStateResizeInProgress) {
log("Display resize can't happen now (state == DisplayStateResizeInProgress)");
log(
"Display resize can't happen now (state == DisplayStateResizeInProgress)");
return;
}

Expand All @@ -53,15 +54,16 @@ class DisplayCubit extends Cubit<DisplayState> with Logger {
void _subscribeToTransportStream() {
_transportStreamSubscription ??=
_transport.jpegDataSubject.listen((imageData) {
window.postMessage(imageData, "*");
});
window.postMessage(imageData, "*");
});
}

void _startResize({required BoxConstraints viewConstraints}) async {
if (state is DisplayStateResizeCoolDown) {
final currentState = state as DisplayStateResizeCoolDown;
if (currentState.viewConstraints == viewConstraints) {
log("Display resize already scheduled (state == DisplayStateResizeCoolDown)");
log(
"Display resize already scheduled (state == DisplayStateResizeCoolDown)");
return;
} else {
_resizeCoolDownTimer?.cancel();
Expand All @@ -72,11 +74,13 @@ class DisplayCubit extends Cubit<DisplayState> with Logger {
final remoteState = await _getRemoteDisplayState();
final lowResPreset = remoteState.lowRes;
final renderer = remoteState.renderer;
final isHeadless = (remoteState.isHeadless ?? 1) == 1;
_transport.updateBinaryType(renderer.binaryType());

final desiredSize = _calculateOptimalSize(
viewConstraints,
lowResModePreset: lowResPreset,
viewConstraints,
lowResModePreset: lowResPreset,
isHeadless: isHeadless,
);

if (remoteState.width == desiredSize.width &&
Expand Down Expand Up @@ -155,10 +159,13 @@ class DisplayCubit extends Cubit<DisplayState> with Logger {
/// Display resolution needs to be aligned by 16 for the hardware encoder
/// Not going below 1280 x 832 just to be safe
///
Size _calculateOptimalSize(
BoxConstraints constraints, {
Size _calculateOptimalSize(BoxConstraints constraints, {
required DisplayLowResModePreset lowResModePreset,
required bool isHeadless,
}) {
if (!isHeadless) {
return const Size(1024, 768);
}
double maxWidth;
double maxHeight;

Expand Down
12 changes: 8 additions & 4 deletions lib/feature/display/model/remote_display_state.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,13 +12,15 @@ class RemoteDisplayState extends Equatable {
final DisplayLowResModePreset lowRes;
@JsonKey(defaultValue: DisplayRendererType.imgTag)
final DisplayRendererType renderer;
final int? isHeadless;

const RemoteDisplayState({
required this.width,
required this.height,
required this.density,
required this.lowRes,
required this.renderer,
this.isHeadless,
});

factory RemoteDisplayState.fromJson(Map<String, dynamic> json) =>
Expand All @@ -27,7 +29,7 @@ class RemoteDisplayState extends Equatable {
Map<String, dynamic> toJson() => _$RemoteDisplayStateToJson(this);

@override
List<Object?> get props => [width, height, density, lowRes];
List<Object?> get props => [width, height, density, lowRes, renderer, isHeadless];

RemoteDisplayState updateLowRes(
{required DisplayLowResModePreset newPreset}) {
Expand All @@ -39,22 +41,24 @@ class RemoteDisplayState extends Equatable {

RemoteDisplayState updateRenderer(
{required DisplayRendererType newType}) {
return copyWith(transportType: newType);
return copyWith(renderer: newType);
}

RemoteDisplayState copyWith({
int? width,
int? height,
int? density,
int? isHeadless,
DisplayLowResModePreset? lowRes,
DisplayRendererType? transportType,
DisplayRendererType? renderer,
}) {
return RemoteDisplayState(
width: width ?? this.width,
height: height ?? this.height,
density: density ?? this.density,
lowRes: lowRes ?? this.lowRes,
renderer: transportType ?? this.renderer,
isHeadless: isHeadless ?? this.isHeadless,
renderer: renderer ?? this.renderer,
);
}
}
Expand Down
2 changes: 2 additions & 0 deletions lib/feature/display/model/remote_display_state.g.dart

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

22 changes: 13 additions & 9 deletions lib/feature/home/home_page.dart
Original file line number Diff line number Diff line change
Expand Up @@ -44,15 +44,19 @@ class HomePage extends StatelessWidget {
child: BlocBuilder<DisplayCubit, DisplayState>(
builder: (context, state) {
if (state is DisplayStateNormal) {
return Stack(
fit: StackFit.expand,
children: [
DisplayView(type: state.rendererType),
PointerInterceptor(
child: TouchScreenView(
displaySize: state.adjustedSize),
),
],
return AspectRatio(
aspectRatio: state.adjustedSize.width /
state.adjustedSize.height,
child: Stack(
fit: StackFit.expand,
children: [
DisplayView(type: state.rendererType),
PointerInterceptor(
child: TouchScreenView(
displaySize: state.adjustedSize),
),
],
),
);
} else {
return const CircularProgressIndicator();
Expand Down
71 changes: 34 additions & 37 deletions lib/feature/touchscreen/touchscreen_view.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,43 +15,40 @@ class TouchScreenView extends StatelessWidget {
Widget build(BuildContext context) {
final touchScreenCubit = BlocProvider.of<TouchscreenCubit>(context);
return LayoutBuilder(builder: (context, constraints) {
return AspectRatio(
aspectRatio: displaySize.width / displaySize.height,
child: Listener(
onPointerDown: (event) {
_handlePointerEvent(
cubit: touchScreenCubit,
event: event,
constraints: constraints,
touchscreenSize: displaySize,
);
},
onPointerMove: (event) {
_handlePointerEvent(
cubit: touchScreenCubit,
event: event,
constraints: constraints,
touchscreenSize: displaySize,
);
},
onPointerCancel: (event) {
_handlePointerEvent(
cubit: touchScreenCubit,
event: event,
constraints: constraints,
touchscreenSize: displaySize,
);
},
onPointerUp: (event) {
_handlePointerEvent(
cubit: touchScreenCubit,
event: event,
constraints: constraints,
touchscreenSize: displaySize,
);
},
child: Container(color: Colors.transparent,),
),
return Listener(
onPointerDown: (event) {
_handlePointerEvent(
cubit: touchScreenCubit,
event: event,
constraints: constraints,
touchscreenSize: displaySize,
);
},
onPointerMove: (event) {
_handlePointerEvent(
cubit: touchScreenCubit,
event: event,
constraints: constraints,
touchscreenSize: displaySize,
);
},
onPointerCancel: (event) {
_handlePointerEvent(
cubit: touchScreenCubit,
event: event,
constraints: constraints,
touchscreenSize: displaySize,
);
},
onPointerUp: (event) {
_handlePointerEvent(
cubit: touchScreenCubit,
event: event,
constraints: constraints,
touchscreenSize: displaySize,
);
},
child: Container(color: Colors.transparent,),
);
});
}
Expand Down