Skip to content
This repository has been archived by the owner on Jan 1, 2025. It is now read-only.

Commit

Permalink
feat: gpu accel rendering now works
Browse files Browse the repository at this point in the history
  • Loading branch information
RossComputerGuy committed May 9, 2024
1 parent ae95f6f commit 86e870f
Show file tree
Hide file tree
Showing 5 changed files with 248 additions and 38 deletions.
96 changes: 74 additions & 22 deletions lib/logic/display.dart
Original file line number Diff line number Diff line change
Expand Up @@ -51,15 +51,15 @@ class DisplayManager extends ChangeNotifier {

switch (call.arguments['propName']) {
case 'appId':
toplevel.appId = call.arguments['propValue'];
toplevel._appId = call.arguments['propValue'];
toplevel.notifyListeners();
break;
case 'title':
toplevel.title = call.arguments['propValue'];
toplevel._title = call.arguments['propValue'];
toplevel.notifyListeners();
break;
case 'texture':
toplevel.texture = call.arguments['propValue'];
toplevel._texture = call.arguments['propValue'];
toplevel.notifyListeners();
break;
case 'parent':
Expand Down Expand Up @@ -134,63 +134,115 @@ class DisplayServer extends ChangeNotifier {

class DisplayServerToplevelSize {
const DisplayServerToplevelSize({
this.width = 0,
this.height = 0,
this.width,
this.height,
});

final int width;
final int height;
final int? width;
final int? height;

dynamic toJSON() {
return <String, dynamic>{
'width': width,
'height': height,
'width': width ?? 0,
'height': height ?? 0,
};
}

static DisplayServerToplevelSize? fromJSON(dynamic data) {
final width = data['width'] > 0 ? data['width'] : null;
final height = data['height'] > 0 ? data['height'] : null;

if (width == null && height == null) return null;

return DisplayServerToplevelSize(
width: width,
height: height,
);
}
}

class DisplayServerToplevel extends ChangeNotifier {
DisplayServerToplevel._(this._server, this.id);
DisplayServerToplevel._(this._server, this.id) : _active = false, _suspended = false;

final DisplayServer _server;
final int id;

String? appId;
String? title;
int? texture;
String? _appId;
String? get appId => _appId;

String? _title;
String? get title => _title;

int? _texture;
int? get texture => _texture;

int? _parent;
DisplayServerToplevel? get parent {
if (_parent == null) return null;
return _server._toplevels.firstWhere((item) => item.id == _parent);
}

DisplayServerToplevelSize? size;
DisplayServerToplevelSize? _size;
DisplayServerToplevelSize? get size => _size;

DisplayServerToplevelSize? _maxSize;
DisplayServerToplevelSize? get maxSize => _maxSize;

DisplayServerToplevelSize? _minSize;
DisplayServerToplevelSize? get minSize => _minSize;

bool _active;
bool get active => _active;

bool _suspended;
bool get suspended => _suspended;

Future<void> sync() async {
final data = await DisplayManager.channel.invokeMethod('getToplevel', <String, dynamic>{
'name': _server.name,
'id': id,
});
print(data);

appId = data['appId'];
title = data['title'];
texture = data['texture'];
_appId = data['appId'];
_title = data['title'];
_texture = data['texture'];
_parent = data['parent'];
size = DisplayServerToplevelSize(
width: data['size']['width'],
height: data['size']['height'],
);
_size = DisplayServerToplevelSize.fromJSON(data['size']);
_minSize = DisplayServerToplevelSize.fromJSON(data['minSize']);
_maxSize = DisplayServerToplevelSize.fromJSON(data['maxSize']);
_active = data['active'];
_suspended = data['suspended'];
notifyListeners();
}

Future<void> setSize(int width, int height) async {
size = DisplayServerToplevelSize(width: width, height: height);
_size = DisplayServerToplevelSize(width: width, height: height);
await DisplayManager.channel.invokeMethod('setToplevel', <String, dynamic>{
'name': _server.name,
'id': id,
'size': size!.toJSON(),
});
await sync();
}

Future<void> setActive(bool isActive) async {
_active = isActive;
await DisplayManager.channel.invokeMethod('setToplevel', <String, dynamic>{
'name': _server.name,
'id': id,
'active': active,
});
await sync();
}

Future<void> setSuspended(bool isSuspended) async {
_suspended = isSuspended;
await DisplayManager.channel.invokeMethod('setToplevel', <String, dynamic>{
'name': _server.name,
'id': id,
'suspended': suspended,
});
await sync();
}
}
5 changes: 3 additions & 2 deletions lib/views/desktop.dart
Original file line number Diff line number Diff line change
Expand Up @@ -113,9 +113,10 @@ class _DesktopViewState extends State<DesktopView> {
fallback: AssetImage('assets/wallpaper/${Breakpoints.small.isActive(context) ? 'mobile' : 'desktop'}/default.jpg'),
)
),
constraints: BoxConstraints.expand(),
child: _displayServer != null
? ChangeNotifierProvider(
create: (_) => _displayServer!,
? ChangeNotifierProvider.value(
value: _displayServer!,
child: Consumer<DisplayServer>(
builder: (context, server, _) =>
Stack(
Expand Down
41 changes: 32 additions & 9 deletions lib/widgets/toplevel.dart
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@ class Toplevel extends StatefulWidget {
const Toplevel({
super.key,
required this.toplevel,
this.isFocusable = true,
});

final DisplayServerToplevel toplevel;
final bool isFocusable;

@override
State<Toplevel> createState() => _ToplevelState();
Expand All @@ -37,11 +39,32 @@ class _ToplevelState extends State<Toplevel> {
}

@override
Widget buildContent(BuildContext context, DisplayServerToplevel toplevel) =>
toplevel.texture == null
? SizedBox() : Texture(
textureId: toplevel.texture!,
);
Widget buildContent(BuildContext context, DisplayServerToplevel toplevel) {
Widget content = ConstrainedBox(
constraints: BoxConstraints(
minWidth: toplevel.minSize == null ? 0 : (toplevel.minSize!.width ?? 0).toDouble(),
minHeight: toplevel.minSize == null ? 0 : (toplevel.minSize!.height ?? 0).toDouble(),
maxWidth: toplevel.maxSize == null ? double.infinity : (toplevel.maxSize!.width ?? double.infinity).toDouble(),
maxHeight: toplevel.maxSize == null ? double.infinity : (toplevel.maxSize!.height ?? double.infinity).toDouble(),
),
child: toplevel.texture == null
? SizedBox() : Texture(
textureId: toplevel.texture!,
),
);

if (widget.isFocusable) {
content = Focus(
onFocusChange: (isFocused) {
toplevel.setActive(isFocused);
toplevel.setSuspended(!isFocused);
},
child: content,
);
}

return content;
}

@override
Widget build(BuildContext context) =>
Expand All @@ -51,15 +74,15 @@ class _ToplevelState extends State<Toplevel> {
return true;
},
child: SizeChangedLayoutNotifier(
child: ChangeNotifierProvider(
create: (_) => widget.toplevel,
child: ChangeNotifierProvider.value(
value: widget.toplevel,
child: Consumer<DisplayServerToplevel>(
key: key,
builder: (context, toplevel, _) =>
toplevel.size != null
? SizedBox(
width: toplevel.size!.width.toDouble(),
height: toplevel.size!.height.toDouble(),
width: toplevel.size!.width == null ? null : toplevel.size!.width!.toDouble(),
height: toplevel.size!.height == null ? null : toplevel.size!.height!.toDouble(),
child: buildContent(context, toplevel),
) : buildContent(context, toplevel),
),
Expand Down
52 changes: 50 additions & 2 deletions linux/channels/display.c
Original file line number Diff line number Diff line change
Expand Up @@ -102,7 +102,7 @@ static void method_call_handler(FlMethodChannel* channel, FlMethodCall* method_c
wlr_data_device_manager_create(wl_display);

disp->seat = wlr_seat_create(wl_display, session_name);
disp->xdg_shell = wlr_xdg_shell_create(wl_display, 3);
disp->xdg_shell = wlr_xdg_shell_create(wl_display, 6);

disp->xdg_decor = wlr_xdg_decoration_manager_v1_create(wl_display);

Expand Down Expand Up @@ -213,7 +213,14 @@ static void method_call_handler(FlMethodChannel* channel, FlMethodCall* method_c
}

if (toplevel->texture != NULL) {
fl_value_set(value, fl_value_new_string("texture"), fl_value_new_int((uintptr_t)FL_TEXTURE(toplevel->texture)));
bool has_init;
g_object_get(G_OBJECT(toplevel->texture), "has-init", &has_init, NULL);

if (has_init) {
fl_value_set(value, fl_value_new_string("texture"), fl_value_new_int((uintptr_t)FL_TEXTURE(toplevel->texture)));
} else {
fl_value_set(value, fl_value_new_string("texture"), fl_value_new_null());
}
} else {
fl_value_set(value, fl_value_new_string("texture"), fl_value_new_null());
}
Expand All @@ -226,6 +233,22 @@ static void method_call_handler(FlMethodChannel* channel, FlMethodCall* method_c
fl_value_set(value_size, fl_value_new_string("height"), fl_value_new_int(geom.height));
fl_value_set(value, fl_value_new_string("size"), value_size);

FlValue* value_size_max = fl_value_new_map();
fl_value_set(value_size_max, fl_value_new_string("width"), fl_value_new_int(toplevel->xdg->current.max_width));
fl_value_set(value_size_max, fl_value_new_string("height"), fl_value_new_int(toplevel->xdg->current.max_height));
fl_value_set(value, fl_value_new_string("maxSize"), value_size_max);

FlValue* value_size_min = fl_value_new_map();
fl_value_set(value_size_min, fl_value_new_string("width"), fl_value_new_int(toplevel->xdg->current.min_width));
fl_value_set(value_size_min, fl_value_new_string("height"), fl_value_new_int(toplevel->xdg->current.min_height));
fl_value_set(value, fl_value_new_string("minSize"), value_size_min);

fl_value_set(value, fl_value_new_string("maximized"), fl_value_new_bool(toplevel->xdg->current.maximized));
fl_value_set(value, fl_value_new_string("fullscreen"), fl_value_new_bool(toplevel->xdg->current.fullscreen));
fl_value_set(value, fl_value_new_string("resizing"), fl_value_new_bool(toplevel->xdg->current.resizing));
fl_value_set(value, fl_value_new_string("active"), fl_value_new_bool(toplevel->xdg->current.activated));
fl_value_set(value, fl_value_new_string("suspended"), fl_value_new_bool(toplevel->xdg->current.suspended));

response = FL_METHOD_RESPONSE(fl_method_success_response_new(value));
} else if (strcmp(fl_method_call_get_name(method_call), "setToplevel") == 0) {
FlValue* args = fl_method_call_get_args(method_call);
Expand All @@ -252,6 +275,31 @@ static void method_call_handler(FlMethodChannel* channel, FlMethodCall* method_c
wlr_xdg_toplevel_set_size(toplevel->xdg, fl_value_get_int(fl_value_lookup_string(value_size, "width")), fl_value_get_int(fl_value_lookup_string(value_size, "height")));
}

FlValue* value_maximized = fl_value_lookup_string(args, "maximized");
if (value_maximized != NULL) {
wlr_xdg_toplevel_set_maximized(toplevel->xdg, fl_value_get_bool(value_maximized));
}

FlValue* value_fullscreen = fl_value_lookup_string(args, "fullscreen");
if (value_fullscreen != NULL) {
wlr_xdg_toplevel_set_fullscreen(toplevel->xdg, fl_value_get_bool(value_fullscreen));
}

FlValue* value_resizing = fl_value_lookup_string(args, "resizing");
if (value_resizing != NULL) {
wlr_xdg_toplevel_set_resizing(toplevel->xdg, fl_value_get_bool(value_resizing));
}

FlValue* value_active = fl_value_lookup_string(args, "active");
if (value_active != NULL) {
wlr_xdg_toplevel_set_activated(toplevel->xdg, fl_value_get_bool(value_active));
}

FlValue* value_suspended = fl_value_lookup_string(args, "suspended");
if (value_suspended != NULL) {
wlr_xdg_toplevel_set_suspended(toplevel->xdg, fl_value_get_bool(value_suspended));
}

response = FL_METHOD_RESPONSE(fl_method_success_response_new(NULL));
} else {
response = FL_METHOD_RESPONSE(fl_method_not_implemented_response_new());
Expand Down
Loading

0 comments on commit 86e870f

Please sign in to comment.