From e02e49b4172c3c8c3fd56ecc4b0b54e9ffe64214 Mon Sep 17 00:00:00 2001 From: VAN BOSSUYT Nicolas Date: Sat, 4 Jan 2025 02:06:10 +0100 Subject: [PATCH] hideo-shell: Application can be started and create instances. --- meta/image/efi/boot/loader.json | 1 + src/apps/hideo-calculator/main/main.cpp | 4 +++ src/apps/hideo-shell/app.cpp | 3 +++ src/apps/hideo-shell/mock.cpp | 1 - src/apps/hideo-shell/model.cpp | 4 +++ src/apps/hideo-shell/model.h | 5 ++++ src/impls/impl-efi/ui.cpp | 4 +++ src/impls/impl-sdl/ui.cpp | 4 +++ src/impls/impl-skift/manifest.json | 3 +-- src/impls/impl-skift/ui.cpp | 10 -------- src/impls/impl-skift/ui/impl.cpp | 34 +++++++++++++++++++++++++ src/impls/impl-skift/ui/manifest.json | 19 ++++++++++++++ src/libs/karm-ui/_embed.h | 3 +++ src/libs/karm-ui/app.cpp | 4 +++ src/libs/karm-ui/app.h | 2 ++ src/srvs/grund-av/manifest.json | 1 + src/srvs/grund-base/manifest.json | 5 ++++ src/srvs/grund-bus/bus.cpp | 22 +++++++++++----- src/srvs/grund-bus/bus.h | 4 ++- src/srvs/grund-bus/main.cpp | 20 +++++++-------- src/srvs/grund-bus/manifest.json | 1 + src/srvs/grund-conf/manifest.json | 1 + src/srvs/grund-device/manifest.json | 1 + src/srvs/grund-dhcp/manifest.json | 1 + src/srvs/grund-dns/manifest.json | 1 + src/srvs/grund-echo/manifest.json | 1 + src/srvs/grund-fs/manifest.json | 1 + src/srvs/grund-net/manifest.json | 1 + src/srvs/grund-seat/manifest.json | 1 + src/srvs/grund-shell/api.h | 14 ++++++++-- src/srvs/grund-shell/main.cpp | 30 +++++++++++++++++++++- src/srvs/grund-shell/manifest.json | 1 + 32 files changed, 174 insertions(+), 33 deletions(-) delete mode 100644 src/impls/impl-skift/ui.cpp create mode 100644 src/impls/impl-skift/ui/impl.cpp create mode 100644 src/impls/impl-skift/ui/manifest.json create mode 100644 src/srvs/grund-base/manifest.json diff --git a/meta/image/efi/boot/loader.json b/meta/image/efi/boot/loader.json index 0b8cd69488c..049bea4edcf 100644 --- a/meta/image/efi/boot/loader.json +++ b/meta/image/efi/boot/loader.json @@ -16,6 +16,7 @@ "bundle://grund-seat/_bin", "bundle://grund-shell/_bin", "bundle://grund-bus/_bin", + "bundle://hideo-calculator.main/_bin", "bundle://hideo-shell/wallpapers/winter.qoi", "bundle://fonts-inter/fonts/Inter-Regular.ttf", "bundle://fonts-inter/fonts/Inter-Medium.ttf", diff --git a/src/apps/hideo-calculator/main/main.cpp b/src/apps/hideo-calculator/main/main.cpp index ef4f3b7c012..cbaa14b7b42 100644 --- a/src/apps/hideo-calculator/main/main.cpp +++ b/src/apps/hideo-calculator/main/main.cpp @@ -4,5 +4,9 @@ #include "../app.h" Async::Task<> entryPointAsync(Sys::Context &ctx) { +#ifdef __ck_sys_skift__ + co_return co_await Ui::runAsync(ctx, Hideo::Calculator::app()); +#else co_return Ui::runApp(ctx, Hideo::Calculator::app()); +#endif } diff --git a/src/apps/hideo-shell/app.cpp b/src/apps/hideo-shell/app.cpp index 68a85898e7f..dfb41c4bfbc 100644 --- a/src/apps/hideo-shell/app.cpp +++ b/src/apps/hideo-shell/app.cpp @@ -174,6 +174,9 @@ Ui::Child appStack(State const &state) { apps.pushBack( i->build() | Ui::box({ + .borderRadii = 6, + .borderWidth = 1, + .borderFill = Ui::GRAY800, .shadowStyle = Gfx::BoxShadow::elevated(zindex ? 4 : 16), }) | Ui::placed(i->bound) | diff --git a/src/apps/hideo-shell/mock.cpp b/src/apps/hideo-shell/mock.cpp index 11381479f6a..2d0188cc88e 100644 --- a/src/apps/hideo-shell/mock.cpp +++ b/src/apps/hideo-shell/mock.cpp @@ -11,7 +11,6 @@ void MockLauncher::launch(State &s) { name, ramp ); - s.activePanel = Panel::NIL; s.instances.emplaceFront(instance); } diff --git a/src/apps/hideo-shell/model.cpp b/src/apps/hideo-shell/model.cpp index 3ac01fb9333..f67ca9a1286 100644 --- a/src/apps/hideo-shell/model.cpp +++ b/src/apps/hideo-shell/model.cpp @@ -30,6 +30,10 @@ Ui::Task reduce(State &s, Action a) { }, [&](StartInstance start) { s.launchers[start.index]->launch(s); + s.activePanel = Panel::NIL; + }, + [&](AddInstance add) { + s.instances.pushBack(add.instance); }, [&](MoveInstance move) { s.activePanel = Panel::NIL; diff --git a/src/apps/hideo-shell/model.h b/src/apps/hideo-shell/model.h index 756b9bb9b8d..a79f52e66c8 100644 --- a/src/apps/hideo-shell/model.h +++ b/src/apps/hideo-shell/model.h @@ -97,6 +97,10 @@ struct StartInstance { usize index; }; +struct AddInstance { + Strong instance; +}; + struct MoveInstance { usize index; Math::Vec2i off; @@ -129,6 +133,7 @@ using Action = Union< Unlock, DimisNoti, StartInstance, + AddInstance, MoveInstance, CloseInstance, FocusInstance, diff --git a/src/impls/impl-efi/ui.cpp b/src/impls/impl-efi/ui.cpp index a4932bed972..131f09ee798 100644 --- a/src/impls/impl-efi/ui.cpp +++ b/src/impls/impl-efi/ui.cpp @@ -65,4 +65,8 @@ Res> makeHost(Child root) { return Ok(makeStrong(root, stip, front, back)); } +Async::Task<> runAsync(Sys::Context&,Child) { + notImplemented(); +} + } // namespace Karm::Ui::_Embed diff --git a/src/impls/impl-sdl/ui.cpp b/src/impls/impl-sdl/ui.cpp index 00e5566b6f3..93cdb841845 100644 --- a/src/impls/impl-sdl/ui.cpp +++ b/src/impls/impl-sdl/ui.cpp @@ -646,4 +646,8 @@ Res> makeHost(Child root) { return Ok(host); } +Async::Task<> runAsync(Sys::Context &, Child) { + notImplemented(); +} + } // namespace Karm::Ui::_Embed diff --git a/src/impls/impl-skift/manifest.json b/src/impls/impl-skift/manifest.json index 11d301abc9b..0fb524e45ef 100644 --- a/src/impls/impl-skift/manifest.json +++ b/src/impls/impl-skift/manifest.json @@ -18,7 +18,6 @@ "karm-logger-impl", "karm-sys-impl", "karm-pkg-impl", - "karm-sys-async-impl", - "karm-ui-impl" + "karm-sys-async-impl" ] } diff --git a/src/impls/impl-skift/ui.cpp b/src/impls/impl-skift/ui.cpp deleted file mode 100644 index 1c6e86a66db..00000000000 --- a/src/impls/impl-skift/ui.cpp +++ /dev/null @@ -1,10 +0,0 @@ -#include -#include - -namespace Karm::Ui::_Embed { - -Res> makeHost(Child) { - notImplemented(); -} - -} // namespace Karm::Ui::_Embed diff --git a/src/impls/impl-skift/ui/impl.cpp b/src/impls/impl-skift/ui/impl.cpp new file mode 100644 index 00000000000..b8a73593698 --- /dev/null +++ b/src/impls/impl-skift/ui/impl.cpp @@ -0,0 +1,34 @@ +#include +#include +#include + +namespace Karm::Ui::_Embed { + +Res> makeHost(Child) { + notImplemented(); +} + +struct Host : public Ui::ProxyNode { + Rpc::Endpoint &_endpoint; + Rpc::Port _shell; + Grund::Shell::Api::Instance _instance; + + Host(Child child, Rpc::Endpoint &endpoint, Rpc::Port shell, Grund::Shell::Api::Instance surface) + : Ui::ProxyNode(std::move(child)), _endpoint(endpoint), _shell(shell), _instance(surface) {} +}; + +Async::Task<> runAsync(Sys::Context &ctx, Child root) { + auto endpoint = Rpc::Endpoint::create(ctx); + auto shell = co_trya$(endpoint.callAsync(Rpc::Port::BUS, "grund-shell"s)); + auto size = root->size({1024, 720}, Hint::MIN); + auto surface = co_trya$(endpoint.callAsync(shell, size)); + + auto host = makeStrong(std::move(root), endpoint, shell, surface); + + while (true) { + auto msg = co_trya$(endpoint.recvAsync()); + logWarn("unsupported event: {}", msg.header()); + } +} + +} // namespace Karm::Ui::_Embed diff --git a/src/impls/impl-skift/ui/manifest.json b/src/impls/impl-skift/ui/manifest.json new file mode 100644 index 00000000000..0b4febf5f26 --- /dev/null +++ b/src/impls/impl-skift/ui/manifest.json @@ -0,0 +1,19 @@ +{ + "$schema": "https://schemas.cute.engineering/stable/cutekit.manifest.component.v1", + "id": "impl-skift.ui", + "type": "lib", + "props": { + "cpp-excluded": true + }, + "enableIf": { + "sys": [ + "skift" + ] + }, + "requires": [ + "karm-rpc" + ], + "provides": [ + "karm-ui-impl" + ] +} diff --git a/src/libs/karm-ui/_embed.h b/src/libs/karm-ui/_embed.h index 7fbb8fc4074..0552bd0443e 100644 --- a/src/libs/karm-ui/_embed.h +++ b/src/libs/karm-ui/_embed.h @@ -1,9 +1,12 @@ #pragma once +#include #include namespace Karm::Ui::_Embed { Res> makeHost(Child root); +Async::Task<> runAsync(Sys::Context &ctx, Child root); + } // namespace Karm::Ui::_Embed diff --git a/src/libs/karm-ui/app.cpp b/src/libs/karm-ui/app.cpp index 631dcd31b28..4f43d00a17e 100644 --- a/src/libs/karm-ui/app.cpp +++ b/src/libs/karm-ui/app.cpp @@ -15,6 +15,10 @@ Res<> runApp(Sys::Context &, Child root) { return try$(_Embed::makeHost(root))->run(); } +Async::Task<> runAsync(Sys::Context &ctx, Child root) { + return _Embed::runAsync(ctx, root); +} + void mountApp(Cli::Command &cmd, Slot rootSlot) { Cli::Flag mobileArg = Cli::flag(NONE, "mobile"s, "Show mobile layout."s); diff --git a/src/libs/karm-ui/app.h b/src/libs/karm-ui/app.h index 298526c265e..b54d1f2e866 100644 --- a/src/libs/karm-ui/app.h +++ b/src/libs/karm-ui/app.h @@ -11,6 +11,8 @@ Child inspector(Child child); Res<> runApp(Sys::Context &ctx, Child root); +Async::Task<> runAsync(Sys::Context &ctx, Child root); + void mountApp(Cli::Command &cmd, Slot rootSlot); } // namespace Karm::Ui diff --git a/src/srvs/grund-av/manifest.json b/src/srvs/grund-av/manifest.json index 89168d2f1ee..4342912af43 100644 --- a/src/srvs/grund-av/manifest.json +++ b/src/srvs/grund-av/manifest.json @@ -9,6 +9,7 @@ ] }, "requires": [ + "grund-base", "karm-rpc", "karm-sys" ] diff --git a/src/srvs/grund-base/manifest.json b/src/srvs/grund-base/manifest.json new file mode 100644 index 00000000000..abe4c8aaa31 --- /dev/null +++ b/src/srvs/grund-base/manifest.json @@ -0,0 +1,5 @@ +{ + "$schema": "https://schemas.cute.engineering/stable/cutekit.manifest.component.v1", + "id": "grund-base", + "type": "lib" +} diff --git a/src/srvs/grund-bus/bus.cpp b/src/srvs/grund-bus/bus.cpp index 0852490d887..a83309a0c59 100644 --- a/src/srvs/grund-bus/bus.cpp +++ b/src/srvs/grund-bus/bus.cpp @@ -41,8 +41,10 @@ Res<> Service::activate(Sys::Context &ctx) { auto &handover = useHandover(ctx); auto urlStr = try$(Io::format("bundle://{}/_bin", _id)); auto *elf = handover.fileByName(urlStr.buf()); - if (not elf) + if (not elf) { + logError("service not found: '{}'", _id); return Error::invalidFilename("service not found"); + } logInfoIf(DEBUG_ELF, "mapping elf..."); auto elfVmo = try$(Hj::Vmo::create(Hj::ROOT, elf->start, elf->size, Hj::VmoFlags::DMA)); @@ -141,7 +143,7 @@ bool Service::accept(Rpc::Message const &msg) { return contains(_listen, msg.header().mid); } -// MARK: Locator --------------------------------------------------------------- +// MARK: System ---------------------------------------------------------------- System::System() { _port = Rpc::Port::BUS; @@ -165,7 +167,8 @@ Res<> System::send(Rpc::Message &msg) { return Error::notFound("service not found"); } else if (msg.is()) { auto start = try$(msg.unpack()); - return _bus->startService(start.id); + logDebug("starting service '{}'", start.id); + return _bus->prepareActivateService(start.id); } return Ok(); @@ -173,18 +176,25 @@ Res<> System::send(Rpc::Message &msg) { // MARK: Bus ------------------------------------------------------------------- -Karm::Res> Bus::create(Sys::Context &ctx) { +Res> Bus::create(Sys::Context &ctx) { return Ok(makeStrong(ctx)); } -Karm::Res<> Bus::startService(Str id) { +Res<> Bus::prepareService(Str id) { auto service = try$(Service::prepare(_context, id)); try$(attach(service)); Async::detach(service->runAsync()); return Ok(); } -Karm::Res<> Bus::attach(Strong endpoint) { +Res<> Bus::prepareActivateService(Str id) { + auto service = try$(Service::prepare(_context, id)); + try$(attach(service)); + Async::detach(service->runAsync()); + return service->activate(_context); +} + +Res<> Bus::attach(Strong endpoint) { endpoint->attach(*this); _endpoints.pushBack(endpoint); return Ok(); diff --git a/src/srvs/grund-bus/bus.h b/src/srvs/grund-bus/bus.h index f30ad1969d2..bfa8956295a 100644 --- a/src/srvs/grund-bus/bus.h +++ b/src/srvs/grund-bus/bus.h @@ -85,7 +85,9 @@ struct Bus : public Meta::Pinned { Res<> dispatch(Rpc::Message &msg); - Res<> startService(Str id); + Res<> prepareService(Str id); + + Res<> prepareActivateService(Str id); }; } // namespace Grund::Bus diff --git a/src/srvs/grund-bus/main.cpp b/src/srvs/grund-bus/main.cpp index 7da333460bf..3a0ad69fb66 100644 --- a/src/srvs/grund-bus/main.cpp +++ b/src/srvs/grund-bus/main.cpp @@ -16,16 +16,16 @@ Async::Task<> entryPointAsync(Sys::Context &ctx) { auto system = co_try$(Bus::create(ctx)); co_try$(system->attach(makeStrong())); - co_try$(system->startService("grund-av"s)); - co_try$(system->startService("grund-conf"s)); - co_try$(system->startService("grund-device"s)); - co_try$(system->startService("grund-dhcp"s)); - co_try$(system->startService("grund-dns"s)); - co_try$(system->startService("grund-echo"s)); - co_try$(system->startService("grund-fs"s)); - co_try$(system->startService("grund-net"s)); - co_try$(system->startService("grund-seat"s)); - co_try$(system->startService("grund-shell"s)); + co_try$(system->prepareService("grund-av"s)); + co_try$(system->prepareService("grund-conf"s)); + co_try$(system->prepareService("grund-device"s)); + co_try$(system->prepareService("grund-dhcp"s)); + co_try$(system->prepareService("grund-dns"s)); + co_try$(system->prepareService("grund-echo"s)); + co_try$(system->prepareService("grund-fs"s)); + co_try$(system->prepareService("grund-net"s)); + co_try$(system->prepareService("grund-seat"s)); + co_try$(system->prepareService("grund-shell"s)); for (auto &endpoint : system->_endpoints) co_try$(endpoint->activate(ctx)); diff --git a/src/srvs/grund-bus/manifest.json b/src/srvs/grund-bus/manifest.json index f2561e20a06..afefdc80656 100644 --- a/src/srvs/grund-bus/manifest.json +++ b/src/srvs/grund-bus/manifest.json @@ -9,6 +9,7 @@ ] }, "requires": [ + "grund-base", "karm-rpc", "karm-sys" ] diff --git a/src/srvs/grund-conf/manifest.json b/src/srvs/grund-conf/manifest.json index 74cfae42aa0..51dd570c935 100644 --- a/src/srvs/grund-conf/manifest.json +++ b/src/srvs/grund-conf/manifest.json @@ -9,6 +9,7 @@ ] }, "requires": [ + "grund-base", "karm-rpc", "karm-sys" ] diff --git a/src/srvs/grund-device/manifest.json b/src/srvs/grund-device/manifest.json index 8efd5fd5a22..b607c903f14 100644 --- a/src/srvs/grund-device/manifest.json +++ b/src/srvs/grund-device/manifest.json @@ -9,6 +9,7 @@ ] }, "requires": [ + "grund-base", "karm-rpc", "karm-sys", "hal" diff --git a/src/srvs/grund-dhcp/manifest.json b/src/srvs/grund-dhcp/manifest.json index 2985f9b8e2b..71f4965fe8b 100644 --- a/src/srvs/grund-dhcp/manifest.json +++ b/src/srvs/grund-dhcp/manifest.json @@ -9,6 +9,7 @@ ] }, "requires": [ + "grund-base", "karm-rpc", "karm-sys" ] diff --git a/src/srvs/grund-dns/manifest.json b/src/srvs/grund-dns/manifest.json index f37d94bd2dc..7c3786ce10b 100644 --- a/src/srvs/grund-dns/manifest.json +++ b/src/srvs/grund-dns/manifest.json @@ -9,6 +9,7 @@ ] }, "requires": [ + "grund-base", "karm-rpc", "karm-sys" ] diff --git a/src/srvs/grund-echo/manifest.json b/src/srvs/grund-echo/manifest.json index 1770ad50b03..b4d1c9178d3 100644 --- a/src/srvs/grund-echo/manifest.json +++ b/src/srvs/grund-echo/manifest.json @@ -9,6 +9,7 @@ ] }, "requires": [ + "grund-base", "karm-rpc", "karm-sys" ] diff --git a/src/srvs/grund-fs/manifest.json b/src/srvs/grund-fs/manifest.json index 76929cfb8f3..8bb66097614 100644 --- a/src/srvs/grund-fs/manifest.json +++ b/src/srvs/grund-fs/manifest.json @@ -9,6 +9,7 @@ ] }, "requires": [ + "grund-base", "karm-rpc", "karm-sys" ] diff --git a/src/srvs/grund-net/manifest.json b/src/srvs/grund-net/manifest.json index 4b559afb125..11cadcfcda0 100644 --- a/src/srvs/grund-net/manifest.json +++ b/src/srvs/grund-net/manifest.json @@ -9,6 +9,7 @@ ] }, "requires": [ + "grund-base", "karm-rpc", "karm-sys" ] diff --git a/src/srvs/grund-seat/manifest.json b/src/srvs/grund-seat/manifest.json index d1e95472d71..8ab1a279385 100644 --- a/src/srvs/grund-seat/manifest.json +++ b/src/srvs/grund-seat/manifest.json @@ -9,6 +9,7 @@ ] }, "requires": [ + "grund-base", "karm-rpc", "karm-sys" ] diff --git a/src/srvs/grund-shell/api.h b/src/srvs/grund-shell/api.h index 08208ea63c9..067853d9ebb 100644 --- a/src/srvs/grund-shell/api.h +++ b/src/srvs/grund-shell/api.h @@ -1,5 +1,15 @@ #pragma once -namespace Grund::Shell { +#include +#include -} // namespace Grund::Shell +namespace Grund::Shell::Api { + +using Instance = usize; + +struct CreateInstance { + using Response = Instance; + Math::Vec2i size; +}; + +} // namespace Grund::Shell::Api diff --git a/src/srvs/grund-shell/main.cpp b/src/srvs/grund-shell/main.cpp index d565ea14641..07168d9350f 100644 --- a/src/srvs/grund-shell/main.cpp +++ b/src/srvs/grund-shell/main.cpp @@ -10,6 +10,7 @@ #include #include "../grund-bus/api.h" +#include "api.h" #include "framebuffer.h" #include "input.h" @@ -107,6 +108,25 @@ struct Root : public Ui::ProxyNode { } }; +struct ServiceInstance : public Hideo::Shell::Instance { + Ui::Child build() const override { + return Ui::empty() | Ui::box({ + .backgroundFill = Ui::GRAY950, + }); + } +}; + +struct ServiceLauncher : public Hideo::Shell::Launcher { + String componentId; + + ServiceLauncher(Mdi::Icon icon, String name, Gfx::ColorRamp ramp, String serviceId) + : Launcher(icon, name, ramp), componentId(serviceId) {} + + void launch(Hideo::Shell::State &) override { + Rpc::globalEndpoint().send(Rpc::Port::BUS, componentId).unwrap(); + } +}; + Async::Task<> servAsync(Sys::Context &ctx) { Hideo::Shell::State state = { .isMobile = false, @@ -114,7 +134,8 @@ Async::Task<> servAsync(Sys::Context &ctx) { .background = co_try$(Image::loadOrFallback("bundle://hideo-shell/wallpapers/winter.qoi"_url)), .noti = {}, .launchers = { - makeStrong(Mdi::CALCULATOR, "hideo-calculator.main"s, Gfx::ORANGE_RAMP), + makeStrong(Mdi::CALCULATOR, "Calculator (Mocked)"s, Gfx::ORANGE_RAMP), + makeStrong(Mdi::CALCULATOR, "Calculator (Real)"s, Gfx::ORANGE_RAMP, "hideo-calculator.main"s), }, .instances = {} }; @@ -139,6 +160,13 @@ Async::Task<> servAsync(Sys::Context &ctx) { root->child().event(*event); } else if (msg.is()) { auto event = msg.unpack(); + } else if (msg.is()) { + auto call = msg.unpack().unwrap(); + logDebug("create instance {}", call.size); + auto instance = makeStrong(); + instance->bound = {100, call.size}; + Hideo::Shell::Model::event(*root, Hideo::Shell::AddInstance{instance}); + (void)msg.packResp(0uz); } else { logWarn("unsupported event: {}", msg.header()); } diff --git a/src/srvs/grund-shell/manifest.json b/src/srvs/grund-shell/manifest.json index 56f06876e22..2b3c684da33 100644 --- a/src/srvs/grund-shell/manifest.json +++ b/src/srvs/grund-shell/manifest.json @@ -11,6 +11,7 @@ ] }, "requires": [ + "grund-base", "hideo-shell", "karm-rpc", "karm-sys"