libports: add Qt6

Fixes #5325
This commit is contained in:
Christian Prochaska 2024-08-19 11:17:52 +02:00 committed by Christian Helmuth
parent 451ea47dd8
commit 18869199ca
165 changed files with 5799 additions and 0 deletions

View File

@ -0,0 +1,17 @@
MIRROR_FROM_REP_DIR := src/app/mixer_gui_qt6
content: $(MIRROR_FROM_REP_DIR) LICENSE
$(MIRROR_FROM_REP_DIR):
$(mirror_from_rep_dir)
MIRROR_FROM_OS := include/mixer
content: $(MIRROR_FROM_OS)
$(MIRROR_FROM_OS):
mkdir -p $(dir $@)
cp -r $(GENODE_DIR)/repos/os/$@ $(dir $@)
LICENSE:
cp $(GENODE_DIR)/LICENSE $@

View File

@ -0,0 +1 @@
2024-08-08 e0c80c1e04f8b05725ba904c9bd0f45d619e6d7b

View File

@ -0,0 +1,10 @@
base
libc
mesa
os
qoost
qt6_base
qt6_component
report_session
stdcxx
vfs

View File

@ -0,0 +1,9 @@
MIRROR_FROM_REP_DIR := src/test/tiled_wm_qt6
content: $(MIRROR_FROM_REP_DIR) LICENSE
$(MIRROR_FROM_REP_DIR):
$(mirror_from_rep_dir)
LICENSE:
cp $(GENODE_DIR)/LICENSE $@

View File

@ -0,0 +1 @@
2024-08-07 2a2c41fe5c6449c94e1346d9b7aeb6c525c7647f

View File

@ -0,0 +1,11 @@
base
libc
mesa
os
qoost
qt6_base
qt6_component
report_session
stdcxx
timer_session
vfs

View File

@ -0,0 +1,83 @@
source ${genode_dir}/repos/libports/run/qt6_common.inc
import_from_depot [depot_user]/src/dynamic_rom \
[depot_user]/src/mixer_gui_qt6
#
# Generate config
#
install_config {
<config>
<parent-provides>
} [qt6_parent_provides] {
</parent-provides>
<default caps="100"/>
<default-route>
<any-service> <parent/> <any-child/> </any-service>
</default-route>
} [qt6_start_nodes] {
<start name="dynamic_rom">
<resource name="RAM" quantum="4M"/>
<provides><service name="ROM"/></provides>
<config verbose="yes">
<rom name="channel_list">
<sleep milliseconds="1000" />
<inline description="first config update">
<channel_list>
<channel type="input" label="test-audio_out0" name="right" number="1" active="1" volume="0" muted="0"/>
<channel type="input" label="test-audio_out_click" name="left" number="0" active="1" volume="75" muted="0"/>
<channel type="input" label="fancy_init -> test-audio_out1" name="left" number="0" active="1" volume="75" muted="0"/>
<channel type="input" label="test-audio_out0" name="left" number="0" active="1" volume="0" muted="0"/>
<channel type="input" label="test-audio_out_click" name="right" number="1" active="1" volume="75" muted="0"/>
<channel type="input" label="fancy_init -> test-audio_out1" name="right" number="1" active="1" volume="75" muted="0"/>
<channel type="output" label="master" name="left" number="0" active="1" volume="100" muted="0"/>
<channel type="output" label="master" name="right" number="1" active="1" volume="100" muted="0"/>
</channel_list>
</inline>
<sleep milliseconds="1000" />
<inline description="second config update">
<channel_list>
<channel type="input" label="test-audio_out0" name="right" number="1" active="1" volume="100" muted="0"/>
<channel type="input" label="test-audio_out_click" name="left" number="0" active="1" volume="75" muted="1"/>
<channel type="input" label="fancy_init -> test-audio_out1" name="left" number="0" active="1" volume="25" muted="0"/>
<channel type="input" label="test-audio_out0" name="left" number="0" active="1" volume="100" muted="0"/>
<channel type="input" label="test-audio_out_click" name="right" number="1" active="1" volume="15" muted="1"/>
<channel type="input" label="fancy_init -> test-audio_out1" name="right" number="1" active="1" volume="25" muted="0"/>
<channel type="output" label="master" name="left" number="0" active="1" volume="100" muted="0"/>
<channel type="output" label="master" name="right" number="1" active="1" volume="100" muted="0"/>
</channel_list>
</inline>
</rom>
</config>
</start>
<start name="mixer_gui_qt" caps="200">
<resource name="RAM" quantum="32M"/>
<config>
<vfs>
<dir name="dev">
<log/>
<inline name="rtc">2018-01-01 00:01</inline>
</dir>
<dir name="pipe"> <pipe/> </dir>
<tar name="qt6_dejavusans.tar"/>
<tar name="qt6_libqgenode.tar"/>
</vfs>
<libc stdout="/dev/log" stderr="/dev/log" pipe="/pipe" rtc="/dev/rtc"/>
</config>
<route>
<service name="Gui"> <child name="wm"/> </service>
<service name="Report" label="shape"> <child name="wm"/> </service>
<service name="ROM" label="channel_list"> <child name="dynamic_rom" /> </service>
<service name="ROM" label="mesa_gpu.lib.so"> <parent label="mesa_gpu-softpipe.lib.so" /> </service>
<any-service> <parent/> <any-child/> </any-service>
</route>
</start>
</config>}
build_boot_image [qt6_boot_modules]
run_genode_until forever
# vi: set ft=tcl :

View File

@ -0,0 +1,228 @@
source ${genode_dir}/repos/libports/run/qt6_common.inc
import_from_depot [depot_user]/src/qt6_component \
[depot_user]/src/qt6_textedit \
[depot_user]/src/dynamic_rom \
[depot_user]/src/test-tiled_wm_qt6
#
# Generate config
#
proc qt6_layouter_config { } {
return { <config rules="rom"> <report rules="no"/> </config>}
}
proc qt6_decorator_binary { } { return "themed_decorator" }
proc qt6_decorator_config { } {
return {
<config>
<vfs>
<dir name="theme">
<inline name="metadata">
<theme>
<aura top="0" bottom="0" left="0" right="0"/>
<decor top="0" bottom="0" left="0" right="0"/>
</theme>
</inline>
</dir>
</vfs>
<libc/>
<default-policy/>
</config>}
}
install_config {
<config>
<parent-provides>} [qt6_parent_provides] {
</parent-provides>
<default caps="100"/>
<default-route>
<any-service> <parent/> <any-child/> </any-service>
</default-route>} [qt6_start_nodes] {
<start name="test_reports">
<binary name="report_rom"/>
<resource name="RAM" quantum="1M"/>
<provides> <service name="Report"/> <service name="ROM"/> </provides>
<config verbose="no">
<policy label="test-tiled_wm-panel -> apps" report="test-tiled_wm-manager -> apps"/>
<policy label="test-tiled_wm-panel -> overlay" report="test-tiled_wm-manager -> overlay"/>
<policy label="test-tiled_wm-manager -> content_request" report="test-tiled_wm-panel -> content_request"/>
<policy label="test-tiled_wm-manager -> overlay_request" report="test-tiled_wm-panel -> overlay_request"/>
</config>
</start>
<start name="wifi_reports">
<binary name="dynamic_rom"/>
<resource name="RAM" quantum="4M"/>
<provides> <service name="ROM"/> </provides>
<config verbose="no">
<rom name="accesspoints">
<inline>
<accesspoints>
<accesspoint ssid="skynet" bssid="00:01:02:03:04:05" quality="40"/>
<accesspoint ssid="foobar" bssid="01:02:03:04:05:06" quality="70" protection="WPA2"/>
<accesspoint ssid="foobar" bssid="01:02:03:04:05:07" quality="10" protection="WPA2"/>
</accesspoints>
</inline>
<sleep milliseconds="60000" />
<inline>
<accesspoints>
</accesspoints>
</inline>
<sleep milliseconds="60000" />
</rom>
<rom name="state">
<inline>
<state>
<accesspoint ssid="foobar" bssid="01:02:03:04:05:06" quality="70" freq="2418" state="disconnected"/>
</state>
</inline>
<sleep milliseconds="60000" />
<inline>
<state>
<accesspoint ssid="foobar" bssid="01:02:03:04:05:06" quality="70" freq="2418" state="connecting"/>
</state>
</inline>
<sleep milliseconds="60000" />
</rom>
</config>
</start>
<start name="test-tiled_wm-manager" caps="120">
<resource name="RAM" quantum="8M"/>
<route>
<service name="ROM" label="content_request"> <child name="test_reports" /> </service>
<service name="ROM" label="overlay_request"> <child name="test_reports" /> </service>
<service name="Report" label="layout_rules"> <child name="wm_report_rom" label="layout_rules"/> </service>
<service name="Report"> <child name="test_reports"/> </service>
<any-service> <parent /> <any-child/> </any-service>
</route>
</start>
<start name="test-tiled_wm-panel" caps="250">
<resource name="RAM" quantum="32M"/>
<config>
<libc stdout="/dev/log" stderr="/dev/log" pipe="/pipe" rtc="/dev/rtc"/>
<vfs>
<dir name="dev">
<log/>
<inline name="rtc">2018-01-01 00:01</inline>
</dir>
<dir name="pipe"> <pipe/> </dir>
<dir name="fs"> <ram/> </dir>
<tar name="qt6_dejavusans.tar"/>
<tar name="qt6_libqgenode.tar"/>
</vfs>
</config>
<route>
<service name="Gui"> <child name="wm"/> </service>
<service name="Report" label="shape"> <child name="wm"/> </service>
<service name="ROM" label="mesa_gpu.lib.so"> <parent label="mesa_gpu-softpipe.lib.so" /> </service>
<service name="ROM" label="apps"> <child name="test_reports" /> </service>
<service name="ROM" label="overlay"> <child name="test_reports" /> </service>
<service name="Report"> <child name="test_reports"/> </service>
<any-service> <parent /> <any-child/> </any-service>
</route>
</start>
<start name="test-tiled_wm-overlay" caps="250">
<resource name="RAM" quantum="32M"/>
<config>
<libc stdout="/dev/log" stderr="/dev/log" pipe="/pipe" rtc="/dev/rtc"/>
<vfs>
<dir name="dev">
<log/>
<inline name="rtc">2018-01-01 00:01</inline>
</dir>
<dir name="pipe"> <pipe/> </dir>
<dir name="fs"> <ram/> </dir>
<tar name="qt6_dejavusans.tar"/>
<tar name="qt6_libqgenode.tar"/>
</vfs>
</config>
<route>
<service name="Gui"> <child name="wm"/> </service>
<service name="Report" label="shape"> <child name="wm"/> </service>
<service name="ROM" label="mesa_gpu.lib.so"> <parent label="mesa_gpu-softpipe.lib.so" /> </service>
<any-service> <parent /> <any-child/> </any-service>
</route>
</start>
<start name="test-tiled_wm-app-1" caps="250">
<binary name="test-tiled_wm-app"/>
<resource name="RAM" quantum="32M"/>
<config name="app1">
<libc stdout="/dev/log" stderr="/dev/log" pipe="/pipe" rtc="/dev/rtc"/>
<vfs>
<dir name="dev">
<log/>
<inline name="rtc">2018-01-01 00:01</inline>
</dir>
<dir name="pipe"> <pipe/> </dir>
<dir name="fs"> <ram/> </dir>
<tar name="qt6_dejavusans.tar"/>
<tar name="qt6_libqgenode.tar"/>
</vfs>
</config>
<route>
<service name="Gui"> <child name="wm"/> </service>
<service name="Report" label="shape"> <child name="wm"/> </service>
<service name="ROM" label="mesa_gpu.lib.so"> <parent label="mesa_gpu-softpipe.lib.so" /> </service>
<any-service> <parent /> <any-child/> </any-service>
</route>
</start>
<start name="test-tiled_wm-app-2" caps="250">
<binary name="test-tiled_wm-app"/>
<resource name="RAM" quantum="32M"/>
<config name="app2">
<libc stdout="/dev/log" stderr="/dev/log" pipe="/pipe" rtc="/dev/rtc"/>
<vfs>
<dir name="dev">
<log/>
<inline name="rtc">2018-01-01 00:01</inline>
</dir>
<dir name="pipe"> <pipe/> </dir>
<dir name="fs"> <ram/> </dir>
<tar name="qt6_dejavusans.tar"/>
<tar name="qt6_libqgenode.tar"/>
</vfs>
</config>
<route>
<service name="Gui"> <child name="wm"/> </service>
<service name="Report" label="shape"> <child name="wm"/> </service>
<service name="ROM" label="mesa_gpu.lib.so"> <parent label="mesa_gpu-softpipe.lib.so" /> </service>
<any-service> <parent /> <any-child/> </any-service>
</route>
</start>
<start name="textedit" caps="250">
<resource name="RAM" quantum="70M"/>
<config>
<libc stdout="/dev/log" stderr="/dev/log" pipe="/pipe" rtc="/dev/rtc"/>
<vfs>
<dir name="dev">
<log/>
<inline name="rtc">2018-01-01 00:01</inline>
</dir>
<dir name="pipe"> <pipe/> </dir>
<dir name="fs"> <ram/> </dir>
<tar name="qt6_dejavusans.tar"/>
<tar name="qt6_libqgenode.tar"/>
</vfs>
</config>
<route>
<service name="Gui"> <child name="wm"/> </service>
<service name="Report" label="shape"> <child name="wm"/> </service>
<service name="ROM" label="mesa_gpu.lib.so"> <parent label="mesa_gpu-softpipe.lib.so" /> </service>
<any-service> <parent /> <any-child/> </any-service>
</route>
</start>
</config>
}
build_boot_image [qt6_boot_modules]
append qemu_args " -device nec-usb-xhci,id=xhci -device usb-tablet"
run_genode_until forever
# vi: set ft=tcl :

View File

@ -0,0 +1,131 @@
/*
* \brief Mixer frontend
* \author Josef Soentgen
* \date 2015-10-15
*/
/*
* Copyright (C) 2015-2020 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
/* Genode includes */
#include <base/log.h>
#include <base/thread.h>
#include <base/attached_rom_dataspace.h>
#include <libc/component.h>
/* Qt includes */
#include <QApplication>
#include <QDebug>
#include <QFile>
/* qt6_component includes */
#include <qt6_component/qpa_init.h>
/* application includes */
#include "main_window.h"
enum { SIGNAL_EP_STACK_SIZE = 16*1024 };
struct Report_handler
{
QMember<Report_proxy> proxy;
Genode::Attached_rom_dataspace channels_rom;
Genode::Entrypoint sig_ep;
Genode::Signal_handler<Report_handler> channels_handler;
Genode::Blockade _report_blockade { };
bool window_connected { false };
void _report(char const *data, size_t size)
{
Genode::Xml_node node(data, size);
proxy->report_changed(&_report_blockade, &node);
/* wait until the report was handled */
_report_blockade.block();
}
void _handle_channels()
{
if (!window_connected)
return;
channels_rom.update();
if (channels_rom.valid())
_report(channels_rom.local_addr<char>(), channels_rom.size());
}
Report_handler(Genode::Env &env)
:
channels_rom(env, "channel_list"),
sig_ep(env, SIGNAL_EP_STACK_SIZE, "signal ep",
Genode::Affinity::Location()),
channels_handler(sig_ep, *this, &Report_handler::_handle_channels)
{
channels_rom.sigh(channels_handler);
}
void connect_window(Main_window *win)
{
QObject::connect(proxy, SIGNAL(report_changed(void *,void const*)),
win, SLOT(report_changed(void *, void const*)),
Qt::QueuedConnection);
window_connected = true;
}
};
static inline void load_stylesheet()
{
QFile file(":style.qss");
if (!file.open(QFile::ReadOnly)) {
qWarning() << "Warning:" << file.errorString()
<< "opening file" << file.fileName();
return;
}
qApp->setStyleSheet(QLatin1String(file.readAll()));
}
void Libc::Component::construct(Libc::Env &env)
{
Libc::with_libc([&] {
qpa_init(env);
int argc = 1;
char const *argv[] = { "mixer_gui_qt", 0 };
Report_handler *report_handler;
try { report_handler = new Report_handler(env); }
catch (...) {
Genode::error("Could not create Report_handler");
return -1;
}
QApplication app(argc, (char**)argv);
load_stylesheet();
QMember<Main_window> main_window(env);
main_window->show();
report_handler->connect_window(main_window);
app.connect(&app, SIGNAL(lastWindowClosed()), SLOT(quit()));
exit(app.exec());
});
}

View File

@ -0,0 +1,463 @@
/*
* \brief Main window of the mixer frontend
* \author Josef Soentgen
* \date 2015-10-15
*/
/*
* Copyright (C) 2015-2017 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
/* Genode includes */
#include <base/log.h>
#include <mixer/channel.h>
#include <base/attached_rom_dataspace.h>
#include <os/reporter.h>
#include <rom_session/connection.h>
/* Qt includes */
#include <QCheckBox>
#include <QFile>
#include <QFrame>
#include <QGuiApplication>
#include <QLabel>
#include <QSlider>
#include <QWidget>
/* application includes */
#include "main_window.h"
/************
** helper **
************/
using Channel = Mixer::Channel;
static struct Names {
char const *name;
Channel::Number number;
} names[] = {
{ "left", Channel::Number::LEFT },
{ "front left", Channel::Number::LEFT },
{ "right", Channel::Number::RIGHT },
{ "front right", Channel::Number::RIGHT },
{ nullptr, Channel::Number::MAX_CHANNELS }
};
static char const *channel_string_from_number(Channel::Number ch)
{
for (Names *n = names; n->name; ++n)
if (ch == n->number)
return n->name;
return nullptr;
}
/* keep sorted! */
static struct Types {
char const *name;
Channel::Type type;
} types[] = {
{ "invalid", Channel::Type::TYPE_INVALID },
{ "input", Channel::Type::INPUT },
{ "output", Channel::Type::OUTPUT }
};
static char const *type_to_string(Channel::Type t) { return types[t].name; }
class Channel_widget : public Compound_widget<QFrame, QVBoxLayout>,
public Genode::List<Channel_widget>::Element
{
Q_OBJECT
private:
Channel::Number _number;
Channel::Type _type;
QCheckBox _muted_checkbox;
QSlider _slider { Qt::Vertical };
QHBoxLayout _slider_hbox;
Q_SIGNALS:
void channel_changed();
public:
Channel_widget(Channel::Type type, Channel::Number number)
:
_number(number), _type(type),
_muted_checkbox("mute")
{
_slider.setMinimum(Channel::Volume_level::MIN);
_slider.setMaximum(Channel::Volume_level::MAX);
_slider_hbox.addStretch();
_slider_hbox.addWidget(&_slider, Qt::AlignCenter);
_slider_hbox.addStretch();
_layout->addLayout(&_slider_hbox);
_layout->addWidget(&_muted_checkbox);
connect(&_slider, SIGNAL(sliderReleased()),
this, SIGNAL(channel_changed()));
connect(&_muted_checkbox, SIGNAL(clicked(bool)),
this, SIGNAL(channel_changed()));
}
Channel::Number number() const { return _number; }
Channel::Type type() const { return _type; }
int volume() const { return _slider.value(); }
void volume(int v) { _slider.setValue(v); }
bool muted() const { return _muted_checkbox.checkState() == Qt::Checked; }
void muted(bool v) { _muted_checkbox.setChecked(v); }
};
class Client_widget : public Compound_widget<QFrame, QVBoxLayout>,
public Genode::List<Client_widget>::Element
{
Q_OBJECT
public:
bool valid { true };
void _sorted_insert(Channel_widget *cw)
{
Channel::Number const nr = cw->number();
Channel_widget const *last = nullptr;
Channel_widget const *w = _list.first();
for (; w; w = w->next()) {
if (w->number() > nr)
break;
last = w;
}
_list.insert(cw, last);
}
private:
Genode::List<Channel_widget> _list;
Channel::Label _label;
QLabel _name;
QHBoxLayout _hlayout;
static char const *_strip_label(Channel::Label const &label)
{
char const * str = label.string();
int pos = 0;
for (int i = 0; str[i]; i++)
if (str[i] == '>') pos = i+1;
return str+pos;
}
Q_SIGNALS:
void client_changed();
public:
Client_widget(Channel::Label const &label)
:
_label(label),
_name(_strip_label(_label))
{
setFrameStyle(QFrame::Panel | QFrame::Raised);
setLineWidth(4);
setToolTip(_label.string());
_name.setAlignment(Qt::AlignCenter);
_name.setContentsMargins(0, 0, 0, 5);
_layout->addWidget(&_name);
_layout->addLayout(&_hlayout);
_layout->setContentsMargins(10, 10, 10, 10);
}
~Client_widget()
{
while (Channel_widget *ch = _list.first()) {
disconnect(ch, SIGNAL(channel_changed()));
_hlayout.removeWidget(ch);
_list.remove(ch);
delete ch;
}
}
Channel::Label const &label() const { return _label; }
Channel_widget* lookup_channel(Channel::Number const number)
{
for (Channel_widget *ch = _list.first(); ch; ch = ch->next())
if (number == ch->number())
return ch;
return nullptr;
}
Channel_widget* add_channel(Channel::Type const type,
Channel::Number const number)
{
Channel_widget *ch = new Channel_widget(type, number);
connect(ch, SIGNAL(channel_changed()),
this, SIGNAL(client_changed()));
_sorted_insert(ch);
_hlayout.addWidget(ch);
return ch;
}
Channel_widget const* first_channel() const { return _list.first(); }
void only_show_first()
{
Channel_widget *cw = _list.first();
while ((cw = cw->next())) cw->hide();
}
bool combined_control() const
{
/*
* Having a seperate volume control widget for each channel is
* nice-to-have but for now it is unnecessary. We therefore disable
* it the hardcoded way.
*/
return true;
}
};
class Client_widget_registry : public QObject
{
Q_OBJECT
private:
Genode::List<Client_widget> _list;
void _remove_destroy(Client_widget *c)
{
disconnect(c, SIGNAL(client_changed()));
_list.remove(c);
delete c;
}
Q_SIGNALS:
void registry_changed();
public:
Client_widget_registry() : QObject() { }
Client_widget* first() { return _list.first(); }
Client_widget* lookup(Channel::Label const &label)
{
for (Client_widget *c = _list.first(); c; c = c->next()) {
if (label == c->label())
return c;
}
return nullptr;
}
Client_widget* alloc_insert(Channel::Label const &label)
{
Client_widget *c = lookup(label);
if (c == nullptr) {
c = new Client_widget(label);
connect(c, SIGNAL(client_changed()),
this, SIGNAL(registry_changed()));
_list.insert(c);
}
return c;
}
void invalidate_all()
{
for (Client_widget *c = _list.first(); c; c = c->next())
c->valid = false;
}
void remove_invalid()
{
for (Client_widget *c = _list.first(); c; c = c->next())
if (c->valid == false) _remove_destroy(c);
}
};
static Client_widget_registry *client_registry()
{
static Client_widget_registry inst;
return &inst;
}
static char const * const config_file = "/config/mixer.config";
static int write_config(char const *file, char const *data, size_t length)
{
if (length == 0) return 0;
QFile mixer_file(file);
if (!mixer_file.open(QIODevice::WriteOnly)) {
Genode::error("could not open '", file, "'");
return -1;
}
mixer_file.write(data, length);
mixer_file.close();
return 0;
}
void Main_window::_update_config()
{
char xml_data[2048];
size_t xml_used = 0;
try {
Genode::Xml_generator xml(xml_data, sizeof(xml_data), "config", [&] {
xml.node("default", [&] {
xml.attribute("out_volume", _default_out_volume);
xml.attribute("volume", _default_volume);
xml.attribute("muted", _default_muted);
});
xml.node("channel_list", [&] {
for (Client_widget const *c = client_registry()->first(); c; c = c->next()) {
bool const combined = c->combined_control();
static int vol = 0;
static bool muted = true;
if (combined) {
Channel_widget const *w = c->first_channel();
vol = w->volume();
muted = w->muted();
}
for (Channel_widget const *w = c->first_channel(); w; w = w->next()) {
Channel::Number const nr = w->number();
xml.node("channel", [&] {
xml.attribute("type", type_to_string(w->type()));
xml.attribute("label", c->label().string());
xml.attribute("name", channel_string_from_number(nr));
xml.attribute("number", nr);
xml.attribute("volume", combined ? vol : w->volume());
xml.attribute("muted", combined ? muted : w->muted());
});
if (_verbose)
Genode::log("label: '", c->label(), "' "
"volume: ", combined ? vol : w->volume(), " "
"muted: ", combined ? muted : w->muted());
}
}
});
});
xml_used = xml.used();
} catch (...) { Genode::warning("could generate 'mixer.config'"); }
write_config(config_file, xml_data, xml_used);
}
void Main_window::_update_clients(Genode::Xml_node &channels)
{
for (Client_widget *c = client_registry()->first(); c; c = c->next())
_layout->removeWidget(c);
client_registry()->invalidate_all();
channels.for_each_sub_node("channel", [&] (Genode::Xml_node const &node) {
try {
Channel ch(node);
Client_widget *c = client_registry()->lookup(ch.label);
if (c == nullptr)
c = client_registry()->alloc_insert(ch.label);
Channel_widget *w = c->lookup_channel(ch.number);
if (w == nullptr)
w = c->add_channel(ch.type, ch.number);
w->volume(ch.volume);
w->muted(ch.muted);
if (c->combined_control()) c->only_show_first();
else w->show();
c->valid = true;
_layout->addWidget(c);
resize(sizeHint());
} catch (Channel::Invalid_channel) { Genode::warning("invalid channel node"); }
});
client_registry()->remove_invalid();
}
/**
* Gets called from the Genode to Qt proxy object when the report was
* updated with a pointer to the XML document.
*/
void Main_window::report_changed(void *l, void const *p)
{
Genode::Blockade &blockade = *reinterpret_cast<Genode::Blockade*>(l);
Genode::Xml_node &node = *((Genode::Xml_node*)p);
if (node.has_type("channel_list"))
_update_clients(node);
blockade.wakeup();
}
Main_window::Main_window(Genode::Env &env)
:
_default_out_volume(0),
_default_volume(0),
_default_muted(true)
{
connect(client_registry(), SIGNAL(registry_changed()),
this, SLOT(_update_config()));
using namespace Genode;
Attached_rom_dataspace const config(env, "config");
_verbose = config.xml().attribute_value("verbose", false);
config.xml().with_sub_node("default",
[&] (Xml_node const &node) {
_default_out_volume = node.attribute_value("out_volume", 0L);
_default_volume = node.attribute_value("volume", 0L);
_default_muted = node.attribute_value("muted", 1L);
},
[&] { warning("no <default> node found, fallback is 'muted=1'"); }
);
}
Main_window::~Main_window()
{
disconnect(client_registry(), SIGNAL(registry_changed()));
}
#include "main_window.moc"

View File

@ -0,0 +1,75 @@
/*
* \brief Main window of the mixer Qt frontend
* \author Josef Soentgen
* \date 2015-10-15
*/
/*
* Copyright (C) 2015-2017 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef _MAIN_WINDOW_H_
#define _MAIN_WINDOW_H_
/* Genode includes */
#include <base/env.h>
#include <util/xml_node.h>
/* Qt includes */
#include <QEvent>
#include <QHBoxLayout>
#include <QWidget>
/* Qoost includes */
#include <qoost/compound_widget.h>
#include <qoost/qmember.h>
/* application includes */
/**
* This class proxies Genode signals to Qt signals
*/
struct Report_proxy : QObject
{
Q_OBJECT
Q_SIGNALS:
void report_changed(void *, void const *);
};
class Main_window : public Compound_widget<QWidget, QHBoxLayout>
{
Q_OBJECT
private:
int _default_out_volume;
int _default_volume;
bool _default_muted;
bool _verbose;
void _update_clients(Genode::Xml_node &);
private Q_SLOTS:
void _update_config();
public Q_SLOTS:
void report_changed(void *, void const *);
public:
Main_window(Genode::Env &);
~Main_window();
};
#endif /* _MAIN_WINDOW_H_ */

View File

@ -0,0 +1,7 @@
QT += core gui widgets
TEMPLATE = app
CONFIG += c++2a
SOURCES += main.cpp \
main_window.cpp
HEADERS += main_window.h
RESOURCES = style.qrc

View File

@ -0,0 +1,6 @@
<!DOCTYPE RCC>
<RCC version="1.0">
<qresource prefix="/">
<file>style.qss</file>
</qresource>
</RCC>

View File

@ -0,0 +1,5 @@
Main_window { min-width: 100; min-height: 100px; }
Client_widget QFrame {
padding: 5px;
}

View File

@ -0,0 +1,12 @@
QMAKE_PROJECT_FILE = $(PRG_DIR)/mixer_gui_qt.pro
QMAKE_TARGET_BINARIES = mixer_gui_qt
QT6_PORT_LIBS = libQt6Core libQt6Gui libQt6Widgets
LIBS = qt6_qmake base libc libm mesa stdcxx qoost
QT6_COMPONENT_LIB_SO =
QT6_GENODE_LIBS_APP += ld.lib.so
qmake_prepared.tag: $(addprefix build_dependencies/lib/,$(QT6_GENODE_LIBS_APP))

View File

@ -0,0 +1,44 @@
/*
* \brief Tiled-WM test: example application widget
* \author Christian Helmuth
* \date 2018-09-28
*/
/*
* Copyright (C) 2018 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
/* Qt includes */
#include <QApplication>
/* local includes */
#include "app.h"
App::App(QString name)
{
_name->setText("This is <b>" + name + "</b> an example application for the tiled-WM test.");
_entry->setPlaceholderText("Placeholder text");
_layout->addWidget(new Spacer(), 1);
_layout->addWidget(_name);
_layout->addWidget(new Spacer(), 1);
_layout->addWidget(_entry);
_layout->addWidget(new Spacer(), 1);
for (int i = 0; i < 3; ++i) {
QLabel *l = new QLabel(QString("QLabel No." + QString::number(i)));
l->setToolTip(QString::number(i) + " is just a number.");
_layout->addWidget(l);
}
_layout->addWidget(new Spacer(), 1);
}
App::~App()
{
}

View File

@ -0,0 +1,46 @@
/*
* \brief TIled-WM test: example application widget
* \author Christian Helmuth
* \date 2018-09-28
*/
/*
* Copyright (C) 2018 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef _TEST__TILED_WM__APP__APP_H_
#define _TEST__TILED_WM__APP__APP_H_
/* Qt includes */
#include <QVBoxLayout>
#include <QLabel>
#include <QWidget>
#include <QLineEdit>
/* Qoost includes */
#include <qoost/compound_widget.h>
#include <qoost/qmember.h>
/* local includes */
#include <util.h>
class App : public Compound_widget<QWidget, QVBoxLayout>
{
Q_OBJECT
private:
QMember<QLabel> _name;
QMember<QLineEdit> _entry;
public:
App(QString name);
~App();
};
#endif /* _TEST__TILED_WM__APP__APP_H_ */

View File

@ -0,0 +1,7 @@
TEMPLATE = app
TARGET = test-tiled_wm-app
QT = core gui widgets
CONFIG += c++2a
SOURCES += main.cpp app.cpp
HEADERS += app.h ../util.h
RESOURCES = app.qrc

View File

@ -0,0 +1,8 @@
<!DOCTYPE RCC>
<RCC version="1.0">
<qresource prefix="/">
<file>../style.qss</file>
</qresource>
</RCC>
<!-- vi: set ft=xml : -->

View File

@ -0,0 +1,55 @@
/*
* \brief Tiled-WM test: example application
* \author Christian Helmuth
* \date 2018-09-26
*/
/*
* Copyright (C) 2018 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
/* Genode includes */
#include <base/attached_rom_dataspace.h>
/* local includes */
#include <util.h>
#include "app.h"
struct Main
{
Libc::Env &env;
Genode::Attached_rom_dataspace config { env, "config" };
QApplication &app { qt6_initialization(env) };
QMember<App> widget { name_from_config() };
QString name_from_config()
{
Name name = config.xml().attribute_value("name", Name("no name"));
return QString(name.string());
}
Main(Libc::Env &env) : env(env)
{
widget->show();
}
};
void Libc::Component::construct(Libc::Env &env)
{
Libc::with_libc([&] {
static Main main { env };
exit(main.app.exec());
});
}

View File

@ -0,0 +1,4 @@
QMAKE_PROJECT_FILE = $(PRG_DIR)/app.pro
QMAKE_TARGET_BINARIES = test-tiled_wm-app
include $(PRG_DIR)/../target.inc

View File

@ -0,0 +1,210 @@
/*
* \brief Tiled-WM test: GUI manager
* \author Christian Helmuth
* \date 2018-09-26
*
* GUI manager implements the user-visible display state machine.
*/
/*
* Copyright (C) 2018 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
/* Genode includes */
#include <base/component.h>
#include <util/string.h>
#include <base/log.h>
#include <base/attached_rom_dataspace.h>
#include <os/reporter.h>
using Name = Genode::String<32>;
namespace Test { struct Manager; }
struct Test::Manager
{
Genode::Env &env;
Genode::Attached_rom_dataspace content_request_rom { env, "content_request" };
Genode::Attached_rom_dataspace overlay_request_rom { env, "overlay_request" };
Genode::Signal_handler<Manager> content_request_handler {
env.ep(), *this, &Manager::handle_content_request };
Genode::Signal_handler<Manager> overlay_request_handler {
env.ep(), *this, &Manager::handle_overlay_request };
Genode::Reporter apps_report { env, "apps" };
Genode::Reporter overlay_report { env, "overlay" };
Genode::Reporter layout_rules_report { env, "rules", "layout_rules" };
struct App {
char const *label;
char const *name;
bool visible;
} apps[3] {
{ "test-tiled_wm-app-1", "app1", true },
{ "test-tiled_wm-app-2", "app2", false },
{ "textedit", "textedit", false }
};
bool overlay_visible { false };
void report_apps();
void report_overlay();
void report_layout_rules();
void handle_content_request();
void handle_overlay_request();
Manager(Genode::Env &env);
};
void Test::Manager::handle_content_request()
{
content_request_rom.update();
Name requested_app =
content_request_rom.xml().attribute_value("name", Name());
if (!requested_app.valid()) return;
App *found = nullptr;
for (App &app : apps) {
if (requested_app != app.name) continue;
found = &app;
break;
}
if (!found || found->visible) return;
for (App &app : apps) {
if (&app == found) {
app.visible = true;
} else {
app.visible = false;
}
}
report_apps();
report_layout_rules();
}
void Test::Manager::handle_overlay_request()
{
overlay_request_rom.update();
bool const request_visible =
overlay_request_rom.xml().attribute_value("visible", false);
if (request_visible == overlay_visible) return;
overlay_visible = request_visible;
report_overlay();
report_layout_rules();
}
void Test::Manager::report_apps()
{
Genode::Reporter::Xml_generator xml(apps_report, [&] () {
for (App &app : apps) {
xml.node("app", [&] () {
xml.attribute("name", app.name);
xml.attribute("visible", app.visible);
});
}
});
}
void Test::Manager::report_overlay()
{
Genode::Reporter::Xml_generator xml(overlay_report, [&] () {
xml.attribute("visible", overlay_visible);
});
}
void Test::Manager::report_layout_rules()
{
Genode::Reporter::Xml_generator xml(layout_rules_report, [&] () {
xml.node("screen", [&] () {
xml.node("column", [&] () {
xml.attribute("name", "screen");
xml.attribute("layer", "1");
xml.node("row", [&] () {
xml.attribute("name", "panel");
xml.attribute("layer", "2");
xml.attribute("height", "24");
});
xml.node("row", [&] () {
xml.attribute("name", "content");
xml.attribute("layer", "4");
xml.node("column", [&] () {
xml.attribute("weight", "2");
});
xml.node("column", [&] () {
xml.attribute("name", "overlay");
xml.attribute("layer", "3");
xml.attribute("weight", "1");
});
});
});
});
xml.node("assign", [&] () {
xml.attribute("label_prefix", "test-tiled_wm-panel");
xml.attribute("target", "panel");
});
xml.node("assign", [&] () {
xml.attribute("label_prefix", "test-tiled_wm-overlay");
xml.attribute("target", "overlay");
if (!overlay_visible)
xml.attribute("visible", false);
});
/* debug */
if (false) {
xml.node("assign", [&] () {
xml.attribute("label_prefix", "");
xml.attribute("target", "screen");
xml.attribute("xpos", "any");
xml.attribute("ypos", "any");
});
}
for (App &app : apps) {
xml.node("assign", [&] () {
xml.attribute("label_prefix", app.label);
xml.attribute("target", "content");
if (!app.visible)
xml.attribute("visible", "false");
});
}
});
}
Test::Manager::Manager(Genode::Env &env) : env(env)
{
apps_report.enabled(true);
overlay_report.enabled(true);
layout_rules_report.enabled(true);
content_request_rom.sigh(content_request_handler);
overlay_request_rom.sigh(overlay_request_handler);
report_apps();
report_overlay();
report_layout_rules();
}
void Component::construct(Genode::Env &env) { static Test::Manager manager(env); }

View File

@ -0,0 +1,3 @@
TARGET = test-tiled_wm-manager
SRC_CC = main.cc
LIBS = base

View File

@ -0,0 +1,43 @@
/*
* \brief Tiled-WM test: example overlay
* \author Christian Helmuth
* \date 2018-09-28
*/
/*
* Copyright (C) 2018 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
/* local includes */
#include <util.h>
#include "overlay.h"
struct Main
{
Libc::Env &env;
QApplication &app { qt6_initialization(env) };
QMember<Overlay> widget { };
Main(Libc::Env &env) : env(env)
{
widget->show();
}
};
void Libc::Component::construct(Libc::Env &env)
{
Libc::with_libc([&] {
static Main main { env };
exit(main.app.exec());
});
}

View File

@ -0,0 +1,36 @@
/*
* \brief Tiled-WM test: overlay widget
* \author Christian Helmuth
* \date 2018-09-28
*/
/*
* Copyright (C) 2018 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
/* Qt includes */
#include <QApplication>
/* local includes */
#include "overlay.h"
Overlay::Overlay()
{
_label->setText("WiFi overlay");
_entry->setEchoMode(QLineEdit::Password);
_layout->addWidget(new Spacer(), 1);
_layout->addWidget(_label);
_layout->addWidget(new Spacer(), 1);
_layout->addWidget(_entry);
_layout->addWidget(new Spacer(), 1);
}
Overlay::~Overlay()
{
}

View File

@ -0,0 +1,46 @@
/*
* \brief Tiled-WM test: overlay widget
* \author Christian Helmuth
* \date 2018-09-28
*/
/*
* Copyright (C) 2018 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef _TEST__TILED_WM__OVERLAY__OVERLAY_H_
#define _TEST__TILED_WM__OVERLAY__OVERLAY_H_
/* Qt includes */
#include <QHBoxLayout>
#include <QLabel>
#include <QWidget>
#include <QLineEdit>
/* Qoost includes */
#include <qoost/compound_widget.h>
#include <qoost/qmember.h>
/* local includes */
#include <util.h>
class Overlay : public Compound_widget<QWidget, QHBoxLayout>
{
Q_OBJECT
private:
QMember<QLabel> _label;
QMember<QLineEdit> _entry;
public:
Overlay();
~Overlay();
};
#endif /* _TEST__TILED_WM__OVERLAY__OVERLAY_H_ */

View File

@ -0,0 +1,7 @@
TEMPLATE = app
TARGET = test-tiled_wm-overlay
QT = core gui widgets
CONFIG += c++2a
SOURCES += main.cpp overlay.cpp
HEADERS += overlay.h ../util.h
RESOURCES = overlay.qrc

View File

@ -0,0 +1,8 @@
<!DOCTYPE RCC>
<RCC version="1.0">
<qresource prefix="/">
<file>../style.qss</file>
</qresource>
</RCC>
<!-- vi: set ft=xml : -->

View File

@ -0,0 +1,4 @@
QMAKE_PROJECT_FILE = $(PRG_DIR)/overlay.pro
QMAKE_TARGET_BINARIES = test-tiled_wm-overlay
include $(PRG_DIR)/../target.inc

View File

@ -0,0 +1,46 @@
/*
* \brief Tiled-WM test: panel
* \author Christian Helmuth
* \date 2018-09-26
*
* Panel is a Qt6-based example panel at the bottom of the screen.
*/
/*
* Copyright (C) 2018 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
/* local includes */
#include "panel.h"
struct Main
{
Libc::Env &env;
Genode::Entrypoint signal_ep { env, 0x4000, "signal ep",
Genode::Affinity::Location() };
QApplication &app { qt6_initialization(env) };
QMember<Panel> widget { env, signal_ep };
Main(Libc::Env &env) : env(env)
{
widget->show();
}
};
void Libc::Component::construct(Libc::Env &env)
{
Libc::with_libc([&] {
static Main main { env };
exit(main.app.exec());
});
}

View File

@ -0,0 +1,148 @@
/*
* \brief Tiled-WM test: panel widget
* \author Christian Helmuth
* \date 2018-09-28
*/
/*
* Copyright (C) 2018 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
/* Qt includes */
#include <QApplication>
/* local includes */
#include "panel.h"
void Panel_button::_clicked() { Q_EMIT clicked(text()); if (text() == "Panel") showMenu(); }
void Panel_button::_toggled(bool checked) { Q_EMIT toggled(checked, text()); }
Panel_button::Panel_button(QString label)
{
if (!label.isNull()) {
setText(label);
}
setCheckable(true);
setSizePolicy(QSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed));
_layout->addWidget(_icon, 0, Qt::AlignCenter);
if (label == "Panel") {
_menu->addAction("Action");
setMenu(_menu);
}
connect(this, SIGNAL(clicked()), SLOT(_clicked()));
connect(this, SIGNAL(toggled(bool)), SLOT(_toggled(bool)));
}
Panel_button::~Panel_button() { }
void App_bar::_app_button(QAbstractButton *b, bool checked)
{
if (!checked) return;
if (Panel_button *button = qobject_cast<Panel_button *>(b)) {
Name name { button->text().toUtf8().constData() };
Genode::Reporter::Xml_generator xml(_content_request, [&] () {
xml.attribute("name", name);
});
}
}
void App_bar::_handle_apps()
{
/* empty bar before adding current apps */
while (QLayoutItem *item = _layout->takeAt(0)) {
if (Panel_button *button = qobject_cast<Panel_button *>(item->widget())) {
_button_group->removeButton(button);
button->deleteLater();
}
delete item;
}
_apps.update();
Panel_button *visible_app_button = nullptr;
_apps.xml().for_each_sub_node("app", [&] (Genode::Xml_node node) {
QString const name { node.attribute_value("name", Name("no name")).string() };
bool const visible { node.attribute_value("visible", false) };
Panel_button *button { new Panel_button(name) };
if (visible) visible_app_button = button;
_button_group->addButton(button);
_layout->addWidget(button);
});
if (visible_app_button) visible_app_button->setChecked(true);
}
App_bar::App_bar(Genode::Env &env, Genode::Entrypoint &sig_ep)
:
_apps(env, "apps"), _content_request(env, "content_request"),
_apps_proxy(sig_ep)
{
_content_request.enabled(true);
_button_group->setExclusive(true);
_handle_apps();
_apps.sigh(*_apps_proxy);
connect(_apps_proxy, SIGNAL(signal()), SLOT(_handle_apps()));
connect(_button_group, SIGNAL(buttonToggled(QAbstractButton *, bool)),
SLOT(_app_button(QAbstractButton *, bool)));
}
App_bar::~App_bar() { }
void Panel::_wifi_toggled(bool checked)
{
Genode::Reporter::Xml_generator xml(_overlay_request, [&] () {
xml.attribute("visible", checked);
});
}
Panel::Panel(Genode::Env &env, Genode::Entrypoint &sig_ep)
:
_overlay(env, "overlay"), _overlay_request(env, "overlay_request"),
_panel_button("Panel"), _app_bar(env, sig_ep)
{
_layout->addWidget(_panel_button);
_layout->addWidget(new Spacer(), 1);
_layout->addWidget(_app_bar);
_layout->addWidget(new Spacer(), 1);
_layout->addWidget(_wifi_button);
_panel_button->setCheckable(false);
_panel_button->setToolTip("This panel is just an example.");
_wifi_button->setObjectName("wifi");
_wifi_button->setToolTip("Open WiFi overlay");
_overlay_request.enabled(true);
_wifi_toggled(_wifi_button->isChecked());
connect(_wifi_button, SIGNAL(toggled(bool)), SLOT(_wifi_toggled(bool)));
}
Panel::~Panel() { }

View File

@ -0,0 +1,111 @@
/*
* \brief Tiled-WM test: panel widget
* \author Christian Helmuth
* \date 2018-09-27
*/
/*
* Copyright (C) 2018 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef _TEST__TILED_WM__PANEL__PANEL_H_
#define _TEST__TILED_WM__PANEL__PANEL_H_
/* Qt includes */
#include <QHBoxLayout>
#include <QPushButton>
#include <QWidget>
#include <QButtonGroup>
#include <QMenu>
/* Qoost includes */
#include <qoost/compound_widget.h>
#include <qoost/qmember.h>
/* Genode includes */
#include <base/attached_rom_dataspace.h>
#include <os/reporter.h>
/* local includes */
#include <util.h>
#include <icon.h> /* build-dir copy of qoost/icon.h works around missing "vtable for Icon" */
class Panel_button : public Compound_widget<QPushButton, QHBoxLayout>
{
Q_OBJECT
private:
QMember<Icon> _icon;
QMember<QMenu> _menu;
private Q_SLOTS:
void _clicked();
void _toggled(bool);
public:
Panel_button(QString label = QString());
~Panel_button();
Q_SIGNALS:
void clicked(QString label);
void toggled(bool checked, QString label);
};
class App_bar : public Compound_widget<QWidget, QHBoxLayout>
{
Q_OBJECT
private:
Genode::Attached_rom_dataspace _apps;
Genode::Reporter _content_request;
QMember<QButtonGroup> _button_group;
QMember<Genode_signal_proxy> _apps_proxy;
private Q_SLOTS:
void _handle_apps();
void _app_button(QAbstractButton *, bool);
public:
App_bar(Genode::Env &, Genode::Entrypoint &);
~App_bar();
};
class Panel : public Compound_widget<QWidget, QHBoxLayout>
{
Q_OBJECT
private:
Genode::Attached_rom_dataspace _overlay;
Genode::Reporter _overlay_request;
QMember<Panel_button> _panel_button;
QMember<App_bar> _app_bar;
QMember<Panel_button> _wifi_button;
private Q_SLOTS:
void _wifi_toggled(bool);
public:
Panel(Genode::Env &, Genode::Entrypoint &);
~Panel();
};
#endif /* _TEST__TILED_WM__PANEL__PANEL_H_ */

View File

@ -0,0 +1,7 @@
TEMPLATE = app
TARGET = test-tiled_wm-panel
QT = core gui widgets
CONFIG += c++2a
SOURCES += main.cpp panel.cpp
HEADERS += panel.h icon.h ../util.h
RESOURCES = panel.qrc

View File

@ -0,0 +1,9 @@
<!DOCTYPE RCC>
<RCC version="1.0">
<qresource prefix="/">
<file>../style.qss</file>
<file>wifi.png</file>
</qresource>
</RCC>
<!-- vi: set ft=xml : -->

View File

@ -0,0 +1,6 @@
QMAKE_PROJECT_FILE = $(PRG_DIR)/panel.pro
QMAKE_TARGET_BINARIES = test-tiled_wm-panel
qmake_prepared.tag: icon.h
include $(PRG_DIR)/../target.inc

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.4 KiB

View File

@ -0,0 +1,22 @@
Panel, Overlay, App { min-width: 100px; min-height: 100px; }
QFrame { padding: 5px; }
QLabel { color: white; }
/*QPushButton { border: none; outline: none; }*/
Panel {
background-color: rgb(51, 93, 128);
}
Panel_button Icon { qproperty-iconSize: 18px; }
Panel_button#wifi Icon { qproperty-iconFile: url(:/wifi.png); }
Overlay {
background-color: rgba(25, 69, 105, 100);
}
App {
background-color: rgb(96, 130, 159);
}
/* vi: set ft=css : */

View File

@ -0,0 +1,25 @@
QT6_PORT_LIBS = libQt6Core libQt6Gui libQt6Widgets
LIBS = qt6_qmake base libc libm mesa stdcxx qoost
QT6_COMPONENT_LIB_SO =
QT6_GENODE_LIBS_APP += ld.lib.so
qmake_prepared.tag: $(addprefix build_dependencies/lib/,$(QT6_GENODE_LIBS_APP))
INC_DIR += $(PRG_DIR)/..
#
# We need Qt headers in a local directory for MOC to work correctly
#
# icon.h from the qoost API package
ICON_H = $(call select_from_repositories,include/qoost/icon.h)
# fall-back to the qoost port directory if that fails
ifeq ($(ICON_H),)
ICON_H := $(call select_from_ports,qoost)/include/qoost/icon.h
endif
icon.h: $(ICON_H)
$(VERBOSE)cp $(ICON_H) .

View File

@ -0,0 +1,116 @@
/*
* \brief Tiled-WM test: utilities
* \author Christian Helmuth
* \date 2018-09-26
*/
/*
* Copyright (C) 2018-2020 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef _TEST__TILED_WM__UTIL_H_
#define _TEST__TILED_WM__UTIL_H_
/* Genode includes */
#include <base/signal.h>
#include <base/thread.h>
#include <base/log.h>
#include <util/string.h>
/* Qt includes */
#include <QApplication>
#include <QObject>
#include <QFile>
#include <QDebug>
#include <QFrame>
/* Qoost includes */
#include <qoost/qmember.h>
/* Libc includes */
#include <libc/component.h>
/* qt6_component includes */
#include <qt6_component/qpa_init.h>
using Name = Genode::String<32>;
/*
* Genode signal to queued Qt signal proxy
*/
class Genode_signal_proxy : public QObject,
public Genode::Signal_handler<Genode_signal_proxy>
{
Q_OBJECT
public:
Genode_signal_proxy(Genode::Entrypoint &sig_ep)
:
Genode::Signal_handler<Genode_signal_proxy>(
sig_ep, *this, &Genode_signal_proxy::handle_genode_signal)
{
connect(this, SIGNAL(internal_signal()),
this, SIGNAL(signal()),
Qt::QueuedConnection);
}
/* called by signal handler / emits internal signal in context of
* signal-entrypoint thread */
void handle_genode_signal() { Q_EMIT internal_signal(); }
Q_SIGNALS:
/* internal_signal() is Qt::QueuedConnection to signal() */
void internal_signal();
/* finally signal() is emitted in the context of the Qt main thread */
void signal();
};
/*
* Qt initialization
*/
static inline QApplication & qt6_initialization(Libc::Env &env)
{
qpa_init(env);
char const *argv[] = { "qt6_app", 0 };
int argc = sizeof(argv)/sizeof(*argv);
static QApplication app(argc, (char**)argv);
QFile file(":style.qss");
if (!file.open(QFile::ReadOnly)) {
qWarning() << "Warning:" << file.errorString()
<< "opening file" << file.fileName();
} else {
qApp->setStyleSheet(QLatin1String(file.readAll()));
}
app.connect(&app, SIGNAL(lastWindowClosed()), SLOT(quit()));
return app;
}
/*
* Widget utilities
*/
struct Spacer : QFrame
{
Q_OBJECT public:
Spacer(QString const &style_id = "") { setObjectName(style_id); }
~Spacer() { }
};
#endif /* _TEST__TILED_WM__UTIL_H_ */

View File

@ -0,0 +1,60 @@
/*
* \brief QPA plugin initialization
* \author Christian Prochaska
* \date 2020-06-28
*/
/*
* Copyright (C) 2020 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU Affero General Public License version 3.
*/
#ifndef _INCLUDE__QPA_INIT_H_
#define _INCLUDE__QPA_INIT_H_
/* Genode includes */
#include <base/env.h>
/* libc includes */
#include <dlfcn.h> /* 'dlopen' */
#include <stdio.h> /* 'fprintf' */
#include <stdlib.h> /* 'exit' */
#include <unistd.h> /* 'access' */
/**
* Initialize the QPA plugin
*
* When Qt loads the plugin again, it will get the same handle.
*/
static inline void qpa_init(Genode::Env &env)
{
char const *qpa_plugin = "/qt/plugins/platforms/libqgenode.lib.so";
void *qpa_plugin_handle = nullptr;
/* check existence with 'access()' first to avoid ld error messages */
if (access(qpa_plugin, F_OK) == 0)
qpa_plugin_handle = dlopen(qpa_plugin, RTLD_LAZY);
if (qpa_plugin_handle) {
typedef void (*initialize_qpa_plugin_t)(Genode::Env &);
initialize_qpa_plugin_t initialize_qpa_plugin =
(initialize_qpa_plugin_t) dlsym(qpa_plugin_handle,
"initialize_qpa_plugin");
if (!initialize_qpa_plugin) {
fprintf(stderr, "Could not find 'initialize_qpa_plugin' \
function in QPA plugin\n");
dlclose(qpa_plugin_handle);
exit(1);
}
initialize_qpa_plugin(env);
}
}
#endif /* _INCLUDE__QPA_INIT_H_ */

View File

@ -0,0 +1,87 @@
QT_TOOLS_DIR = /usr/local/genode/tool/23.05/qt6
ifeq ($(filter-out $(SPECS),arm),)
QT_PLATFORM = genode-arm-g++
else ifeq ($(filter-out $(SPECS),arm_64),)
QT_PLATFORM = genode-aarch64-g++
else ifeq ($(filter-out $(SPECS),x86_32),)
QT_PLATFORM = genode-x86_32-g++
else ifeq ($(filter-out $(SPECS),x86_64),)
QT_PLATFORM = genode-x86_64-g++
else
$(error Error: unsupported platform)
endif
ifeq ($(CONTRIB_DIR),)
QT_DIR = $(call select_from_repositories,src/lib/qt6)
QT_API_DIR = $(call select_from_repositories,mkspecs)/..
abi_symbol_path = $(wildcard $(call select_from_repositories,lib/symbols/$1))
else
QT_PORT_DIR := $(call select_from_ports,qt6)
QT_DIR = $(QT_PORT_DIR)/src/lib/qt6
QT_API_DIR = $(QT_DIR)/genode/api
abi_symbol_path = $(wildcard $(addprefix $(QT_API_DIR)/lib/symbols/,$1))
endif
ifeq ($(VERBOSE),)
MAKE_VERBOSE="1"
else
QT6_OUTPUT_FILTER = > /dev/null
endif
#
# Genode libraries to be linked to Qt applications and libraries
#
QT6_COMPONENT_LIB_SO ?= qt6_component.lib.so
QT6_GENODE_LIBS_COMMON += libc.lib.so libm.lib.so stdcxx.lib.so
QT6_GENODE_LIBS_APP += $(QT6_GENODE_LIBS_COMMON) $(QT6_COMPONENT_LIB_SO)
QT6_GENODE_LIBS_SHLIB += $(QT6_GENODE_LIBS_COMMON)
#
# common 'build_dependencies' rules
#
build_dependencies:
$(VERBOSE)mkdir -p $@
build_dependencies/include: build_dependencies
$(VERBOSE)mkdir -p $@
$(VERBOSE)ln -snf $(QT_API_DIR)/include/* $@/
build_dependencies/lib: build_dependencies
$(VERBOSE)mkdir -p $@
build_dependencies/lib/%.lib.so: build_dependencies/lib
$(VERBOSE)ln -sf $(BUILD_BASE_DIR)/var/libcache/$*/$*.abi.so $@
build_dependencies/lib/%.lib.a: build_dependencies/lib
$(VERBOSE)ln -sf $(BUILD_BASE_DIR)/var/libcache/$*/$*.lib.a $@
#
# rules for generating .lib.so files from port symbol files
#
lib_name = $(notdir $(1:.lib.so=))
abi_name = $(notdir $(1:.abi.so=))
abi_path = build_dependencies/abi/$(call abi_name,$1)/$(call abi_name,$1).abi.so
so_path = build_dependencies/lib/$(call lib_name,$1).lib.so
BUILD_DEPENDENCIES_QT6_SO_FILES := $(foreach L,$(QT6_PORT_LIBS),$(call so_path,$L))
BUILD_DEPENDENCIES_QT6_ABI_FILES := $(foreach L,$(QT6_PORT_LIBS),$(call abi_path,$L))
$(BUILD_DEPENDENCIES_QT6_ABI_FILES):
$(VERBOSE)mkdir -p $(dir $@)
$(VERBOSE)$(MAKE) -C $(dir $@) -f $(BASE_DIR)/mk/abi.mk \
SYMBOLS=$(call abi_symbol_path,$(call abi_name,$@)) \
LIB=$(call abi_name,$@) \
BUILD_BASE_DIR=$(BUILD_BASE_DIR) \
SHELL=$(SHELL)
$(BUILD_DEPENDENCIES_QT6_SO_FILES): $(BUILD_DEPENDENCIES_QT6_ABI_FILES)
.PHONY: qt6_so_files
qt6_so_files: $(BUILD_DEPENDENCIES_QT6_SO_FILES)
$(VERBOSE)for l in $(QT6_PORT_LIBS); do \
ln -sf ../abi/$$l/$$l.abi.so build_dependencies/lib/$$l.lib.so; done

View File

@ -0,0 +1,142 @@
#
# The following externally defined variables are evaluated:
#
# CMAKE_LISTS_DIR: path to the CMakeLists.txt file
# CMAKE_TARGET_BINARIES binaries to be stripped and linked into 'bin' and 'debug' directories
# QT6_PORT_LIBS: Qt6 libraries used from port (for example libQt6Core)
# QT6_COMPONENT_LIB_SO: if defined empty, disables linking with qt6_component.lib.so
#
include $(call select_from_repositories,lib/import/import-qt6.inc)
#
# flags to be passed to CMake
#
GENODE_CMAKE_CFLAGS += \
-D__FreeBSD__=12 \
-D__GENODE__ \
-ffunction-sections \
-fno-strict-aliasing \
$(CC_OPT_NOSTDINC) \
$(CC_MARCH) \
$(CC_OPT_PIC) \
$(filter-out -I.,$(INCLUDES)) \
-I$(CURDIR)/build_dependencies/mkspecs/$(QT_PLATFORM)
GENODE_CMAKE_LFLAGS_APP += \
$(addprefix $(LD_OPT_PREFIX),$(LD_MARCH)) \
$(addprefix $(LD_OPT_PREFIX),$(LD_OPT_GC_SECTIONS)) \
$(addprefix $(LD_OPT_PREFIX),$(LD_OPT_ALIGN_SANE)) \
$(addprefix $(LD_OPT_PREFIX),--dynamic-list=$(BASE_DIR)/src/ld/genode_dyn.dl) \
$(LD_OPT_NOSTDLIB) \
-Wl,-Ttext=0x01000000 \
$(CC_MARCH) \
-Wl,--dynamic-linker=$(DYNAMIC_LINKER).lib.so \
-Wl,--eh-frame-hdr \
-Wl,-rpath-link=. \
-Wl,-T -Wl,$(LD_SCRIPT_DYN) \
-L$(CURDIR)/build_dependencies/lib \
-Wl,--whole-archive \
-Wl,--start-group \
$(addprefix -l:,$(QT6_GENODE_LIBS_APP)) \
$(shell $(CC) $(CC_MARCH) -print-libgcc-file-name) \
-Wl,--end-group \
-Wl,--no-whole-archive
GENODE_CMAKE_LFLAGS_SHLIB += \
$(LD_OPT_NOSTDLIB) \
-Wl,-shared \
-Wl,--eh-frame-hdr \
$(addprefix $(LD_OPT_PREFIX),$(LD_MARCH)) \
$(addprefix $(LD_OPT_PREFIX),$(LD_OPT_GC_SECTIONS)) \
$(addprefix $(LD_OPT_PREFIX),$(LD_OPT_ALIGN_SANE)) \
-Wl,-T -Wl,$(LD_SCRIPT_SO) \
$(addprefix $(LD_OPT_PREFIX),--entry=0x0) \
-L$(CURDIR)/build_dependencies/lib \
-Wl,--whole-archive \
-Wl,--start-group \
$(addprefix -l:,$(QT6_GENODE_LIBS_SHLIB)) \
$(shell $(CC) $(CC_MARCH) -print-libgcc-file-name) \
-l:ldso_so_support.lib.a \
-Wl,--end-group \
-Wl,--no-whole-archive
##
## prepare a directory named 'build_dependencies' where CMake can find needed files
##
build_dependencies/lib/cmake: build_dependencies/lib
$(VERBOSE)ln -snf $(QT_API_DIR)/lib/cmake $@
build_dependencies/metatypes: build_dependencies
$(VERBOSE)ln -snf $(QT_API_DIR)/metatypes $@
build_dependencies/mkspecs: build_dependencies
$(VERBOSE)ln -snf $(QT_API_DIR)/mkspecs $@
cmake_prepared.tag: \
build_dependencies/include \
build_dependencies/lib/cmake \
build_dependencies/lib/libc.lib.so \
build_dependencies/lib/libm.lib.so \
build_dependencies/lib/egl.lib.so \
build_dependencies/lib/mesa.lib.so \
build_dependencies/lib/qt6_component.lib.so \
build_dependencies/lib/stdcxx.lib.so \
build_dependencies/lib/ldso_so_support.lib.a \
build_dependencies/metatypes \
build_dependencies/mkspecs
$(VERBOSE)touch $@
.PHONY: build_with_cmake
# 'make' called by CMake uses '/bin/sh', which does not understand '-o pipefail'
unexport .SHELLFLAGS
build_with_cmake: cmake_prepared.tag qt6_so_files
$(VERBOSE)cmake \
-G "Unix Makefiles" \
-DCMAKE_PREFIX_PATH="$(CURDIR)/build_dependencies" \
-DCMAKE_MODULE_PATH="$(CURDIR)/build_dependencies/lib/cmake/Modules" \
-DCMAKE_SYSTEM_NAME="Genode" \
-DCMAKE_AR="$(AR)" \
-DCMAKE_C_COMPILER="$(CC)" \
-DCMAKE_C_FLAGS="$(GENODE_CMAKE_CFLAGS)" \
-DCMAKE_CXX_COMPILER="$(CXX)" \
-DCMAKE_CXX_FLAGS="$(GENODE_CMAKE_CFLAGS)" \
-DCMAKE_EXE_LINKER_FLAGS="$(GENODE_CMAKE_LFLAGS_APP)" \
-DCMAKE_SHARED_LINKER_FLAGS="$(GENODE_CMAKE_LFLAGS_SHLIB)" \
-DCMAKE_MODULE_LINKER_FLAGS="$(GENODE_CMAKE_LFLAGS_SHLIB)" \
--no-warn-unused-cli \
$(CMAKE_LISTS_DIR) \
$(QT6_OUTPUT_FILTER)
$(VERBOSE)$(MAKE) VERBOSE=$(MAKE_VERBOSE)
#
# Not every CMake project has an 'install' target, so execute
# this target only if a binary to be installed has "install/" in
# its path.
#
ifneq ($(findstring install/,$(CMAKE_TARGET_BINARIES)),)
$(VERBOSE)$(MAKE) VERBOSE=$(MAKE_VERBOSE) DESTDIR=install install
endif
$(VERBOSE)for cmake_target_binary in $(CMAKE_TARGET_BINARIES); do \
$(OBJCOPY) --only-keep-debug $${cmake_target_binary} $${cmake_target_binary}.debug; \
$(STRIP) $${cmake_target_binary} -o $${cmake_target_binary}.stripped; \
$(OBJCOPY) --add-gnu-debuglink=$${cmake_target_binary}.debug $${cmake_target_binary}.stripped; \
ln -sf $(CURDIR)/$${cmake_target_binary}.stripped $(PWD)/bin/`basename $${cmake_target_binary}`; \
ln -sf $(CURDIR)/$${cmake_target_binary}.stripped $(PWD)/debug/`basename $${cmake_target_binary}`; \
ln -sf $(CURDIR)/$${cmake_target_binary}.debug $(PWD)/debug/; \
done
BUILD_ARTIFACTS += $(notdir $(CMAKE_TARGET_BINARIES))
#
# build applications with CMake
#
TARGET ?= $(CMAKE_LISTS_DIR).cmake_target
.PHONY: $(TARGET)
$(TARGET): build_with_cmake $(QT6_EXTRA_TARGET_DEPS)

View File

@ -0,0 +1,176 @@
#
# The following externally defined variables are evaluated:
#
# QMAKE_PROJECT_FILE: path to the qmake project file (for applications with target.mk)
# QMAKE_TARGET_BINARIES binaries to be stripped and linked into 'bin' and 'debug' directories
# QT6_PORT_LIBS: Qt6 libraries used from port (for example libQt6Core)
# QT6_COMPONENT_LIB_SO: if defined empty, disables linking with qt6_component.lib.so
#
include $(call select_from_repositories,lib/import/import-qt6.inc)
QMAKE = build_dependencies/bin/qmake
#
# flags to be passed to qmake via env.sh and mkspecs/common/genode.conf
#
GENODE_QMAKE_CFLAGS += \
-D__FreeBSD__=12 \
-D__GENODE__ \
-ffunction-sections \
-fno-strict-aliasing \
$(CC_OPT_NOSTDINC) \
$(CC_MARCH) \
$(CC_OPT_PIC) \
$(filter-out -I.,$(INCLUDES)) \
-I$(CURDIR)/build_dependencies/include/QtCore/spec/$(QT_PLATFORM)
GENODE_QMAKE_LFLAGS_APP += \
$(addprefix $(LD_OPT_PREFIX),$(LD_MARCH)) \
$(addprefix $(LD_OPT_PREFIX),$(LD_OPT_GC_SECTIONS)) \
$(addprefix $(LD_OPT_PREFIX),$(LD_OPT_ALIGN_SANE)) \
$(addprefix $(LD_OPT_PREFIX),--dynamic-list=$(BASE_DIR)/src/ld/genode_dyn.dl) \
$(LD_OPT_NOSTDLIB) \
-Wl,-Ttext=0x01000000 \
$(CC_MARCH) \
-Wl,--dynamic-linker=$(DYNAMIC_LINKER).lib.so \
-Wl,--eh-frame-hdr \
-Wl,-rpath-link=. \
-Wl,-T -Wl,$(LD_SCRIPT_DYN) \
-L$(CURDIR)/build_dependencies/lib \
-Wl,--whole-archive \
-Wl,--start-group \
$(addprefix -l:,$(QT6_GENODE_LIBS_APP)) \
-Wl,--end-group \
-Wl,--no-whole-archive
GENODE_QMAKE_LFLAGS_SHLIB += \
$(LD_OPT_NOSTDLIB) \
-Wl,-shared \
-Wl,--eh-frame-hdr \
$(addprefix $(LD_OPT_PREFIX),$(LD_MARCH)) \
$(addprefix $(LD_OPT_PREFIX),$(LD_OPT_GC_SECTIONS)) \
$(addprefix $(LD_OPT_PREFIX),$(LD_OPT_ALIGN_SANE)) \
-Wl,-T -Wl,$(LD_SCRIPT_SO) \
$(addprefix $(LD_OPT_PREFIX),--entry=0x0) \
-L$(CURDIR)/build_dependencies/lib \
-Wl,--whole-archive \
-Wl,--start-group \
$(addprefix -l:,$(QT6_GENODE_LIBS_SHLIB)) \
-l:ldso_so_support.lib.a \
-Wl,--end-group \
-Wl,--no-whole-archive
#
# libgcc must appear on the command line after all other libs
# (including those added by qmake) and using the QMAKE_LIBS
# variable achieves this, fortunately
#
GENODE_QMAKE_LIBS = \
$(shell $(CC) $(CC_MARCH) -print-libgcc-file-name)
ifeq ($(CONTRIB_DIR),)
GENODE_QMAKE_INCDIR_OPENGL = $(call select_from_repositories,include/GL)/..
GENODE_QMAKE_INCDIR_EGL = $(call select_from_repositories,include/EGL)/..
else
GENODE_QMAKE_INCDIR_OPENGL := $(call select_from_ports,mesa)/include
GENODE_QMAKE_INCDIR_EGL := $(call select_from_ports,mesa)/include
endif
GENODE_QMAKE_LIBS_OPENGL = $(CURDIR)/build_dependencies/lib/mesa.lib.so
GENODE_QMAKE_LIBS_EGL = $(CURDIR)/build_dependencies/lib/egl.lib.so
#
# export variables for qmake.conf
#
env.sh:
$(VERBOSE)rm -f $@
$(VERBOSE)echo "export GENODE_QMAKE_CC='$(CC)'" >> $@
$(VERBOSE)echo "export GENODE_QMAKE_CXX='$(CXX)'" >> $@
$(VERBOSE)echo "export GENODE_QMAKE_LINK='$(CXX)'" >> $@
$(VERBOSE)echo "export GENODE_QMAKE_AR='$(AR)'" >> $@
$(VERBOSE)echo "export GENODE_QMAKE_OBJCOPY='$(OBJCOPY)'" >> $@
$(VERBOSE)echo "export GENODE_QMAKE_NM='$(NM)'" >> $@
$(VERBOSE)echo "export GENODE_QMAKE_STRIP='$(STRIP)'" >> $@
$(VERBOSE)echo "export GENODE_QMAKE_CFLAGS='$(GENODE_QMAKE_CFLAGS)'" >> $@
$(VERBOSE)echo "export GENODE_QMAKE_LFLAGS_APP='$(GENODE_QMAKE_LFLAGS_APP)'" >> $@
$(VERBOSE)echo "export GENODE_QMAKE_LFLAGS_SHLIB='$(GENODE_QMAKE_LFLAGS_SHLIB)'" >> $@
$(VERBOSE)echo "export GENODE_QMAKE_LIBS='$(GENODE_QMAKE_LIBS)'" >> $@
$(VERBOSE)echo "export GENODE_QMAKE_INCDIR_OPENGL='$(GENODE_QMAKE_INCDIR_OPENGL)'" >> $@
$(VERBOSE)echo "export GENODE_QMAKE_LIBS_OPENGL='$(GENODE_QMAKE_LIBS_OPENGL)'" >> $@
$(VERBOSE)echo "export GENODE_QMAKE_INCDIR_EGL='$(GENODE_QMAKE_INCDIR_EGL)'" >> $@
$(VERBOSE)echo "export GENODE_QMAKE_LIBS_EGL='$(GENODE_QMAKE_LIBS_EGL)'" >> $@
#
# prepare a directory named 'build_dependencies' where qmake can find needed files
#
build_dependencies/bin: build_dependencies
$(VERBOSE)mkdir -p $@
$(VERBOSE)ln -sf $(QT_TOOLS_DIR)/bin/* $@/
build_dependencies/lib/libQt6Core.so.6: build_dependencies/lib
$(VERBOSE)ln -sf $(QT_TOOLS_DIR)/lib/libQt6Core.so.6 $@
build_dependencies/libexec: build_dependencies
$(VERBOSE)mkdir -p $@
$(VERBOSE)ln -sf $(QT_TOOLS_DIR)/libexec/* $@/
build_dependencies/mkspecs: build_dependencies
$(VERBOSE)mkdir -p $@
$(VERBOSE)ln -sf $(QT_API_DIR)/mkspecs/* $@/
$(VERBOSE)rm -f $@/modules
$(VERBOSE)mkdir $@/modules
$(VERBOSE)ln -snf $(QT_API_DIR)/mkspecs/modules/* $@/modules/
$(VERBOSE)ln -sf $(QT_PLATFORM)/qconfig.pri $@/
$(VERBOSE)ln -sf $(QT_PLATFORM)/qmodule.pri $@/
qmake_prepared.tag: env.sh \
build_dependencies/bin \
build_dependencies/include \
build_dependencies/lib/libQt6Core.so.6 \
build_dependencies/lib/libc.lib.so \
build_dependencies/lib/libm.lib.so \
build_dependencies/lib/egl.lib.so \
build_dependencies/lib/mesa.lib.so \
build_dependencies/lib/qt6_component.lib.so \
build_dependencies/lib/stdcxx.lib.so \
build_dependencies/lib/ldso_so_support.lib.a \
build_dependencies/libexec \
build_dependencies/mkspecs
$(VERBOSE)touch $@
.PHONY: build_with_qmake
build_with_qmake: qmake_prepared.tag qt6_so_files
$(VERBOSE)source env.sh && $(QMAKE) \
-spec build_dependencies/mkspecs/$(QT_PLATFORM) \
-qtconf build_dependencies/mkspecs/$(QT_PLATFORM)/qt.conf \
-nocache \
$(QMAKE_PROJECT_FILE) \
"CONFIG += force_debug_info" \
$(QT6_OUTPUT_FILTER)
$(VERBOSE)source env.sh && $(MAKE) $(QT6_OUTPUT_FILTER)
$(VERBOSE)for qmake_target_binary in $(QMAKE_TARGET_BINARIES); do \
$(OBJCOPY) --only-keep-debug $${qmake_target_binary} $${qmake_target_binary}.debug; \
$(STRIP) $${qmake_target_binary} -o $${qmake_target_binary}.stripped; \
$(OBJCOPY) --add-gnu-debuglink=$${qmake_target_binary}.debug $${qmake_target_binary}.stripped; \
ln -sf $(CURDIR)/$${qmake_target_binary}.stripped $(PWD)/bin/$${qmake_target_binary}; \
ln -sf $(CURDIR)/$${qmake_target_binary}.stripped $(PWD)/debug/$${qmake_target_binary}; \
ln -sf $(CURDIR)/$${qmake_target_binary}.debug $(PWD)/debug/; \
done
BUILD_ARTIFACTS += $(notdir $(QMAKE_TARGET_BINARIES))
#
# build applications with qmake
#
TARGET ?= $(notdir $(QMAKE_PROJECT_FILE)).qmake_target
.PHONY: $(TARGET)
$(TARGET): build_with_qmake $(QT6_EXTRA_TARGET_DEPS)

View File

@ -0,0 +1,118 @@
LIBS = qt6_cmake ldso_so_support libc libm stdcxx qt6_component egl mesa base qoost
INSTALL_LIBS = lib/libQt6Concurrent.lib.so \
lib/libQt6Core.lib.so \
lib/libQt6Gui.lib.so \
lib/libQt6Network.lib.so \
lib/libQt6OpenGL.lib.so \
lib/libQt6OpenGLWidgets.lib.so \
lib/libQt6PrintSupport.lib.so \
lib/libQt6Sql.lib.so \
lib/libQt6Test.lib.so \
lib/libQt6Widgets.lib.so \
lib/libQt6Xml.lib.so \
plugins/platforms/libqgenode.lib.so \
plugins/imageformats/libqjpeg.lib.so \
plugins/sqldrivers/libqsqlite.lib.so
BUILD_ARTIFACTS = $(notdir $(INSTALL_LIBS)) \
qt6_libqgenode.tar \
qt6_libqjpeg.tar \
qt6_libqsqlite.tar
cmake_prepared.tag: build_dependencies/lib/ld.lib.so
build: cmake_prepared.tag
@#
@# run cmake
@#
$(VERBOSE)cmake \
-G "Unix Makefiles" \
-DQT_SILENCE_CMAKE_GENERATOR_WARNING=ON \
-DCMAKE_SYSTEM_NAME="Genode" \
-DCMAKE_AR="$(AR)" \
-DCMAKE_C_COMPILER="$(CC)" \
-DCMAKE_C_FLAGS="$(GENODE_CMAKE_CFLAGS)" \
-DCMAKE_CXX_COMPILER="$(CXX)" \
-DCMAKE_CXX_FLAGS="$(GENODE_CMAKE_CFLAGS)" \
-DCMAKE_EXE_LINKER_FLAGS="$(GENODE_CMAKE_LFLAGS_APP)" \
-DCMAKE_SHARED_LINKER_FLAGS="$(GENODE_CMAKE_LFLAGS_SHLIB)" \
-DCMAKE_MODULE_LINKER_FLAGS="$(GENODE_CMAKE_LFLAGS_SHLIB)" \
-DQT_QMAKE_TARGET_MKSPEC=$(QT_PLATFORM) \
-DCMAKE_INSTALL_PREFIX=/qt \
-DQT_HOST_PATH="$(QT_TOOLS_DIR)" \
-DBUILD_WITH_PCH=OFF \
-DCMAKE_BUILD_TYPE=RelWithDebInfo \
-DQT_BUILD_EXAMPLES=OFF \
-DQT_QPA_DEFAULT_PLATFORM=genode \
-DFEATURE_cxx20=ON \
-DFEATURE_relocatable=OFF \
-DFEATURE_evdev=OFF \
-DFEATURE_icu=OFF \
-DFEATURE_system_harfbuzz=OFF \
-DFEATURE_backtrace=OFF \
-DFEATURE_glib=OFF \
-DFEATURE_zstd=OFF \
-DFEATURE_system_pcre2=OFF \
-DFEATURE_system_zlib=OFF \
-DFEATURE_dbus=OFF \
-DFEATURE_libudev=OFF \
-DFEATURE_opengl_desktop=ON \
-DFEATURE_egl=ON \
-DFEATURE_xkbcommon=OFF \
-DFEATURE_networkinterface=OFF \
-DFEATURE_vulkan=OFF \
-DFEATURE_reduce_relocations=OFF \
-DFEATURE_pkg_config=OFF \
$(QT_DIR)/qtbase \
$(QT6_OUTPUT_FILTER)
@#
@# build
@#
$(VERBOSE)$(MAKE) VERBOSE=$(MAKE_VERBOSE)
@#
@# install into local 'install' directory
@#
$(VERBOSE)$(MAKE) VERBOSE=$(MAKE_VERBOSE) DESTDIR=install install
@#
@# remove shared library existence checks since many libs are not
@# present and not needed at build time
@#
$(VERBOSE)find $(CURDIR)/install/qt/lib/cmake -name "*.cmake" \
-exec sed -i "/list(APPEND _IMPORT_CHECK_TARGETS /d" {} \;
@#
@# strip libs and create symlinks in 'bin' and 'debug' directories
@#
$(VERBOSE)for LIB in $(INSTALL_LIBS); do \
cd $(CURDIR)/install/qt/$$(dirname $${LIB}) && \
$(OBJCOPY) --only-keep-debug $$(basename $${LIB}) $$(basename $${LIB}).debug && \
$(STRIP) $$(basename $${LIB}) -o $$(basename $${LIB}).stripped && \
$(OBJCOPY) --add-gnu-debuglink=$$(basename $${LIB}).debug $$(basename $${LIB}).stripped; \
ln -sf $(CURDIR)/install/qt/$${LIB}.stripped $(PWD)/bin/$$(basename $${LIB}); \
ln -sf $(CURDIR)/install/qt/$${LIB}.stripped $(PWD)/debug/$$(basename $${LIB}); \
ln -sf $(CURDIR)/install/qt/$${LIB}.debug $(PWD)/debug/; \
done
@#
@# create tar archives
@#
$(VERBOSE)tar chf $(PWD)/bin/qt6_libqgenode.tar $(TAR_OPT) --transform='s/\.stripped//' -C install qt/plugins/platforms/libqgenode.lib.so.stripped
$(VERBOSE)tar chf $(PWD)/bin/qt6_libqjpeg.tar $(TAR_OPT) --transform='s/\.stripped//' -C install qt/plugins/imageformats/libqjpeg.lib.so.stripped
$(VERBOSE)tar chf $(PWD)/bin/qt6_libqsqlite.tar $(TAR_OPT) --transform='s/\.stripped//' -C install qt/plugins/sqldrivers/libqsqlite.lib.so.stripped
.PHONY: build
ifeq ($(called_from_lib_mk),yes)
all: build
endif

View File

@ -0,0 +1,4 @@
#
# This is a dummy library description file for the implicit inclusion of
# import-qt6_cmake.mk.
#

View File

@ -0,0 +1,9 @@
SRC_CC = qt_component.cc
LIBS = libc
SHARED_LIB = yes
vpath qt_component.cc $(REP_DIR)/src/lib/qt6_component
CC_CXX_WARN_STRICT =

View File

@ -0,0 +1,140 @@
QT6_PORT_LIBS = libQt6Core libQt6Gui libQt6OpenGL libQt6Network libQt6Sql libQt6Test libQt6Widgets
LIBS = qt6_cmake ldso_so_support libc libm mesa egl qt6_component stdcxx
INSTALL_LIBS = lib/libQt6LabsAnimation.lib.so \
lib/libQt6LabsFolderListModel.lib.so \
lib/libQt6LabsQmlModels.lib.so \
lib/libQt6LabsSettings.lib.so \
lib/libQt6LabsSharedImage.lib.so \
lib/libQt6LabsWavefrontMesh.lib.so \
lib/libQt6Qml.lib.so \
lib/libQt6QmlCompiler.lib.so \
lib/libQt6QmlCore.lib.so \
lib/libQt6QmlLocalStorage.lib.so \
lib/libQt6QmlModels.lib.so \
lib/libQt6QmlWorkerScript.lib.so \
lib/libQt6QmlXmlListModel.lib.so \
lib/libQt6Quick.lib.so \
lib/libQt6QuickControls2.lib.so \
lib/libQt6QuickControls2Impl.lib.so \
lib/libQt6QuickDialogs2.lib.so \
lib/libQt6QuickDialogs2QuickImpl.lib.so \
lib/libQt6QuickDialogs2Utils.lib.so \
lib/libQt6QuickEffects.lib.so \
lib/libQt6QuickLayouts.lib.so \
lib/libQt6QuickParticles.lib.so \
lib/libQt6QuickShapes.lib.so \
lib/libQt6QuickTemplates2.lib.so \
lib/libQt6QuickTest.lib.so \
lib/libQt6QuickWidgets.lib.so \
qml/Qt/labs/animation/liblabsanimationplugin.lib.so \
qml/Qt/labs/folderlistmodel/libqmlfolderlistmodelplugin.lib.so \
qml/Qt/labs/platform/libqtlabsplatformplugin.lib.so \
qml/Qt/labs/qmlmodels/liblabsmodelsplugin.lib.so \
qml/Qt/labs/settings/libqmlsettingsplugin.lib.so \
qml/Qt/labs/sharedimage/libsharedimageplugin.lib.so \
qml/Qt/labs/wavefrontmesh/libqmlwavefrontmeshplugin.lib.so \
qml/QtQml/Base/libqmlplugin.lib.so \
qml/QtQml/Models/libmodelsplugin.lib.so \
qml/QtQml/WorkerScript/libworkerscriptplugin.lib.so \
qml/QtQml/XmlListModel/libqmlxmllistmodelplugin.lib.so \
qml/QtQml/libqmlmetaplugin.lib.so \
qml/QtQuick/Controls/Basic/libqtquickcontrols2basicstyleplugin.lib.so \
qml/QtQuick/Controls/Basic/impl/libqtquickcontrols2basicstyleimplplugin.lib.so \
qml/QtQuick/Controls/Fusion/libqtquickcontrols2fusionstyleplugin.lib.so \
qml/QtQuick/Controls/Fusion/impl/libqtquickcontrols2fusionstyleimplplugin.lib.so \
qml/QtQuick/Controls/Imagine/libqtquickcontrols2imaginestyleplugin.lib.so \
qml/QtQuick/Controls/Imagine/impl/libqtquickcontrols2imaginestyleimplplugin.lib.so \
qml/QtQuick/Controls/Material/libqtquickcontrols2materialstyleplugin.lib.so \
qml/QtQuick/Controls/Material/impl/libqtquickcontrols2materialstyleimplplugin.lib.so \
qml/QtQuick/Controls/Universal/libqtquickcontrols2universalstyleplugin.lib.so \
qml/QtQuick/Controls/Universal/impl/libqtquickcontrols2universalstyleimplplugin.lib.so \
qml/QtQuick/Controls/libqtquickcontrols2plugin.lib.so \
qml/QtQuick/Controls/impl/libqtquickcontrols2implplugin.lib.so \
qml/QtQuick/Dialogs/libqtquickdialogsplugin.lib.so \
qml/QtQuick/Dialogs/quickimpl/libqtquickdialogs2quickimplplugin.lib.so \
qml/QtQuick/Effects/libeffectsplugin.lib.so \
qml/QtQuick/Layouts/libqquicklayoutsplugin.lib.so \
qml/QtQuick/LocalStorage/libqmllocalstorageplugin.lib.so \
qml/QtQuick/NativeStyle/libqtquickcontrols2nativestyleplugin.lib.so \
qml/QtQuick/Particles/libparticlesplugin.lib.so \
qml/QtQuick/Shapes/libqmlshapesplugin.lib.so \
qml/QtQuick/Templates/libqtquicktemplates2plugin.lib.so \
qml/QtQuick/Window/libquickwindowplugin.lib.so \
qml/QtQuick/tooling/libquicktoolingplugin.lib.so \
qml/QtQuick/libqtquick2plugin.lib.so \
qml/QtTest/libquicktestplugin.lib.so
BUILD_ARTIFACTS = $(notdir $(INSTALL_LIBS)) \
qt6_declarative_qml.tar
build: cmake_prepared.tag qt6_so_files
@#
@# run cmake
@#
$(VERBOSE)cmake \
-G "Unix Makefiles" \
-DCMAKE_PREFIX_PATH="$(CURDIR)/build_dependencies" \
-DCMAKE_MODULE_PATH="$(CURDIR)/build_dependencies/lib/cmake/Modules" \
-DCMAKE_SYSTEM_NAME="Genode" \
-DCMAKE_AR="$(AR)" \
-DCMAKE_C_COMPILER="$(CC)" \
-DCMAKE_C_FLAGS="$(GENODE_CMAKE_CFLAGS)" \
-DCMAKE_CXX_COMPILER="$(CXX)" \
-DCMAKE_CXX_FLAGS="$(GENODE_CMAKE_CFLAGS)" \
-DCMAKE_EXE_LINKER_FLAGS="$(GENODE_CMAKE_LFLAGS_APP)" \
-DCMAKE_SHARED_LINKER_FLAGS="$(GENODE_CMAKE_LFLAGS_SHLIB)" \
-DCMAKE_MODULE_LINKER_FLAGS="$(GENODE_CMAKE_LFLAGS_SHLIB)" \
-DQT_QMAKE_TARGET_MKSPEC=$(QT_PLATFORM) \
-DCMAKE_INSTALL_PREFIX=/qt \
$(QT_DIR)/qtdeclarative \
$(QT6_OUTPUT_FILTER)
@#
@# build
@#
$(VERBOSE)$(MAKE) VERBOSE=$(MAKE_VERBOSE)
@#
@# install into local 'install' directory
@#
$(VERBOSE)$(MAKE) VERBOSE=$(MAKE_VERBOSE) DESTDIR=install install
@#
@# remove shared library existence checks since many libs are not
@# present and not needed at build time
@#
$(VERBOSE)find $(CURDIR)/install/qt/lib/cmake -name "*.cmake" \
-exec sed -i "/list(APPEND _IMPORT_CHECK_TARGETS /d" {} \;
@#
@# strip libs and create symlinks in 'bin' and 'debug' directories
@#
$(VERBOSE)for LIB in $(INSTALL_LIBS); do \
cd $(CURDIR)/install/qt/$$(dirname $${LIB}) && \
$(OBJCOPY) --only-keep-debug $$(basename $${LIB}) $$(basename $${LIB}).debug && \
$(STRIP) $$(basename $${LIB}) -o $$(basename $${LIB}).stripped && \
$(OBJCOPY) --add-gnu-debuglink=$$(basename $${LIB}).debug $$(basename $${LIB}).stripped; \
ln -sf $(CURDIR)/install/qt/$${LIB}.stripped $(PWD)/bin/$$(basename $${LIB}); \
ln -sf $(CURDIR)/install/qt/$${LIB}.stripped $(PWD)/debug/$$(basename $${LIB}); \
ln -sf $(CURDIR)/install/qt/$${LIB}.debug $(PWD)/debug/; \
done
@#
@# create tar archives
@#
$(VERBOSE)tar chf $(PWD)/bin/qt6_declarative_qml.tar $(TAR_OPT) --exclude='*.lib.so' --transform='s/\.stripped//' -C install qt/qml
.PHONY: build
ifeq ($(called_from_lib_mk),yes)
all: build
endif

View File

@ -0,0 +1,4 @@
#
# This is a dummy library description file for the implicit inclusion of
# import-qt6_qmake.mk.
#

View File

@ -0,0 +1,71 @@
QT6_PORT_LIBS = libQt6Core libQt6Gui
LIBS = qt6_cmake ldso_so_support libc libm egl mesa qt6_component stdcxx
INSTALL_LIBS = lib/libQt6ShaderTools.lib.so
BUILD_ARTIFACTS = $(notdir $(INSTALL_LIBS))
build: cmake_prepared.tag qt6_so_files
@#
@# run cmake
@#
$(VERBOSE)cmake \
-G "Unix Makefiles" \
-DCMAKE_PREFIX_PATH="$(CURDIR)/build_dependencies" \
-DCMAKE_MODULE_PATH="$(CURDIR)/build_dependencies/lib/cmake/Modules" \
-DCMAKE_SYSTEM_NAME="Genode" \
-DCMAKE_AR="$(AR)" \
-DCMAKE_C_COMPILER="$(CC)" \
-DCMAKE_C_FLAGS="$(GENODE_CMAKE_CFLAGS)" \
-DCMAKE_CXX_COMPILER="$(CXX)" \
-DCMAKE_CXX_FLAGS="$(GENODE_CMAKE_CFLAGS)" \
-DCMAKE_EXE_LINKER_FLAGS="$(GENODE_CMAKE_LFLAGS_APP)" \
-DCMAKE_SHARED_LINKER_FLAGS="$(GENODE_CMAKE_LFLAGS_SHLIB)" \
-DCMAKE_MODULE_LINKER_FLAGS="$(GENODE_CMAKE_LFLAGS_SHLIB)" \
-DQT_QMAKE_TARGET_MKSPEC=$(QT_PLATFORM) \
-DCMAKE_INSTALL_PREFIX=/qt \
$(QT_DIR)/qtshadertools \
$(QT6_OUTPUT_FILTER)
@#
@# build
@#
$(VERBOSE)$(MAKE) VERBOSE=$(MAKE_VERBOSE)
@#
@# install into local 'install' directory
@#
$(VERBOSE)$(MAKE) VERBOSE=$(MAKE_VERBOSE) DESTDIR=install install
@#
@# remove shared library existence checks since many libs are not
@# present and not needed at build time
@#
$(VERBOSE)find $(CURDIR)/install/qt/lib/cmake -name "*.cmake" \
-exec sed -i "/list(APPEND _IMPORT_CHECK_TARGETS /d" {} \;
@#
@# strip libs and create symlinks in 'bin' and 'debug' directories
@#
$(VERBOSE)for LIB in $(INSTALL_LIBS); do \
cd $(CURDIR)/install/qt/$$(dirname $${LIB}) && \
$(OBJCOPY) --only-keep-debug $$(basename $${LIB}) $$(basename $${LIB}).debug && \
$(STRIP) $$(basename $${LIB}) -o $$(basename $${LIB}).stripped && \
$(OBJCOPY) --add-gnu-debuglink=$$(basename $${LIB}).debug $$(basename $${LIB}).stripped; \
ln -sf $(CURDIR)/install/qt/$${LIB}.stripped $(PWD)/bin/$$(basename $${LIB}); \
ln -sf $(CURDIR)/install/qt/$${LIB}.stripped $(PWD)/debug/$$(basename $${LIB}); \
ln -sf $(CURDIR)/install/qt/$${LIB}.debug $(PWD)/debug/; \
done
.PHONY: build
ifeq ($(called_from_lib_mk),yes)
all: build
endif

View File

@ -0,0 +1,71 @@
QT6_PORT_LIBS = libQt6Core libQt6Gui libQt6Widgets
LIBS = qt6_cmake ldso_so_support libc libm egl mesa qt6_component stdcxx
INSTALL_LIBS = lib/libQt6Svg.lib.so
BUILD_ARTIFACTS = $(notdir $(INSTALL_LIBS))
build: cmake_prepared.tag qt6_so_files
@#
@# run cmake
@#
$(VERBOSE)cmake \
-G "Unix Makefiles" \
-DCMAKE_PREFIX_PATH="$(CURDIR)/build_dependencies" \
-DCMAKE_MODULE_PATH="$(CURDIR)/build_dependencies/lib/cmake/Modules" \
-DCMAKE_SYSTEM_NAME="Genode" \
-DCMAKE_AR="$(AR)" \
-DCMAKE_C_COMPILER="$(CC)" \
-DCMAKE_C_FLAGS="$(GENODE_CMAKE_CFLAGS)" \
-DCMAKE_CXX_COMPILER="$(CXX)" \
-DCMAKE_CXX_FLAGS="$(GENODE_CMAKE_CFLAGS)" \
-DCMAKE_EXE_LINKER_FLAGS="$(GENODE_CMAKE_LFLAGS_APP)" \
-DCMAKE_SHARED_LINKER_FLAGS="$(GENODE_CMAKE_LFLAGS_SHLIB)" \
-DCMAKE_MODULE_LINKER_FLAGS="$(GENODE_CMAKE_LFLAGS_SHLIB)" \
-DQT_QMAKE_TARGET_MKSPEC=$(QT_PLATFORM) \
-DCMAKE_INSTALL_PREFIX=/qt \
$(QT_DIR)/qtsvg \
$(QT6_OUTPUT_FILTER)
@#
@# build
@#
$(VERBOSE)$(MAKE) VERBOSE=$(MAKE_VERBOSE)
@#
@# install into local 'install' directory
@#
$(VERBOSE)$(MAKE) VERBOSE=$(MAKE_VERBOSE) DESTDIR=install install
@#
@# remove shared library existence checks since many libs are not
@# present and not needed at build time
@#
$(VERBOSE)find $(CURDIR)/install/qt/lib/cmake -name "*.cmake" \
-exec sed -i "/list(APPEND _IMPORT_CHECK_TARGETS /d" {} \;
@#
@# strip libs and create symlinks in 'bin' and 'debug' directories
@#
$(VERBOSE)for LIB in $(INSTALL_LIBS); do \
cd $(CURDIR)/install/qt/$$(dirname $${LIB}) && \
$(OBJCOPY) --only-keep-debug $$(basename $${LIB}) $$(basename $${LIB}).debug && \
$(STRIP) $$(basename $${LIB}) -o $$(basename $${LIB}).stripped && \
$(OBJCOPY) --add-gnu-debuglink=$$(basename $${LIB}).debug $$(basename $${LIB}).stripped; \
ln -sf $(CURDIR)/install/qt/$${LIB}.stripped $(PWD)/bin/$$(basename $${LIB}); \
ln -sf $(CURDIR)/install/qt/$${LIB}.stripped $(PWD)/debug/$$(basename $${LIB}); \
ln -sf $(CURDIR)/install/qt/$${LIB}.debug $(PWD)/debug/; \
done
.PHONY: build
ifeq ($(called_from_lib_mk),yes)
all: build
endif

View File

@ -0,0 +1,7 @@
_ZN4Libc9Component9constructERNS_3EnvE T
#
# Make sure there is an undefined reference to "main". Because Qt6 apps don't
# link the posix library (where main is also undefined), we need this so "main"
# does not get garbage collected during linking.
#
main U

View File

@ -0,0 +1 @@
65bfe06368aa913897c75ac819acb9d1efdf367f

View File

@ -0,0 +1,8 @@
LICENSE := GPL
VERSION := 6.6.2
DOWNLOADS := qt6.archive
URL(qt6) := https://download.qt.io/official_releases/qt/6.6/6.6.2/single/qt-everywhere-src-6.6.2.tar.xz
SHA(qt6) := 3c1e42b3073ade1f7adbf06863c01e2c59521b7cc2349df2f74ecd7ebfcb922d
DIR(qt6) := src/lib/qt6

View File

@ -0,0 +1 @@
22e90c4bc425795166ebec55fd1853311862bc99

View File

@ -0,0 +1,8 @@
LICENSE := GPL
VERSION := 6.6.2
DOWNLOADS := qt6.git
URL(qt6) := https://github.com/cproc/qt6.git
REV(qt6) := issue5325
DIR(qt6) := src/lib/qt6

View File

@ -0,0 +1,48 @@
MIRROR_FROM_REP_DIR := lib/import/import-qt6.inc \
lib/import/import-qt6_cmake.mk \
lib/import/import-qt6_qmake.mk \
lib/mk/qt6_cmake.mk \
lib/mk/qt6_qmake.mk
content: $(MIRROR_FROM_REP_DIR)
$(MIRROR_FROM_REP_DIR):
$(mirror_from_rep_dir)
PORT_DIR := $(call port_dir,$(REP_DIR)/ports/qt6)
API_DIR := $(PORT_DIR)/src/lib/qt6/genode/api
MIRROR_FROM_PORT_DIR := include \
metatypes \
mkspecs \
lib/cmake \
MIRROR_SYMBOLS := lib/symbols/libQt6Concurrent \
lib/symbols/libQt6Core \
lib/symbols/libQt6Gui \
lib/symbols/libQt6Network \
lib/symbols/libQt6OpenGL \
lib/symbols/libQt6OpenGLWidgets \
lib/symbols/libQt6PrintSupport \
lib/symbols/libQt6Sql \
lib/symbols/libQt6Test \
lib/symbols/libQt6Widgets \
lib/symbols/libQt6Xml \
lib/symbols/libqgenode
content: $(MIRROR_FROM_PORT_DIR)
$(MIRROR_FROM_PORT_DIR):
cp -r $(API_DIR)/$@ $@
content: $(MIRROR_SYMBOLS)
$(MIRROR_SYMBOLS):
mkdir -p lib/symbols
cp $(API_DIR)/$@ lib/symbols
content: LICENSE
LICENSE:
cp $(PORT_DIR)/src/lib/qt6/LICENSE.LGPL3 $@

View File

@ -0,0 +1 @@
2024-07-20 2e4d78a8311cb2ea12f3318ab8e055eeec6cf44d

View File

@ -0,0 +1,10 @@
MIRROR_FROM_REP_DIR := include/qt6_component \
lib/symbols/qt6_component
content: $(MIRROR_FROM_REP_DIR) LICENSE
$(MIRROR_FROM_REP_DIR):
$(mirror_from_rep_dir)
LICENSE:
cp $(GENODE_DIR)/LICENSE $@

View File

@ -0,0 +1 @@
2024-02-25 2ab86f26cd18d37d2313fc1a998103d98e2dc37f

View File

@ -0,0 +1,39 @@
PORT_DIR := $(call port_dir,$(REP_DIR)/ports/qt6)
MIRROR_LIB_SYMBOLS := libQt6LabsAnimation \
libQt6LabsFolderListModel \
libQt6LabsQmlModels \
libQt6LabsSettings \
libQt6LabsSharedImage \
libQt6LabsWavefrontMesh \
libQt6Qml \
libQt6QmlCompiler \
libQt6QmlCore \
libQt6QmlLocalStorage \
libQt6QmlModels \
libQt6QmlWorkerScript \
libQt6QmlXmlListModel \
libQt6Quick \
libQt6QuickControls2 \
libQt6QuickControls2Impl \
libQt6QuickDialogs2 \
libQt6QuickDialogs2QuickImpl \
libQt6QuickDialogs2Utils \
libQt6QuickEffects \
libQt6QuickLayouts \
libQt6QuickParticles \
libQt6QuickShapes \
libQt6QuickTemplates2 \
libQt6QuickTest \
libQt6QuickWidgets
content: $(MIRROR_LIB_SYMBOLS)
$(MIRROR_LIB_SYMBOLS):
mkdir -p lib/symbols
cp $(PORT_DIR)/src/lib/qt6/genode/api/lib/symbols/$@ lib/symbols/
content: LICENSE
LICENSE:
cp $(PORT_DIR)/src/lib/qt6/LICENSE.LGPL3 $@

View File

@ -0,0 +1 @@
2024-08-13 b019a06ae7a5361afab6fbde1d2f81911936adc7

View File

@ -0,0 +1,14 @@
PORT_DIR := $(call port_dir,$(REP_DIR)/ports/qt6)
MIRROR_LIB_SYMBOLS := libQt6ShaderTools
content: $(MIRROR_LIB_SYMBOLS)
$(MIRROR_LIB_SYMBOLS):
mkdir -p lib/symbols
cp $(PORT_DIR)/src/lib/qt6/genode/api/lib/symbols/$@ lib/symbols/
content: LICENSE
LICENSE:
cp $(PORT_DIR)/src/lib/qt6/LICENSE.LGPL3 $@

View File

@ -0,0 +1 @@
2024-08-13 b019a06ae7a5361afab6fbde1d2f81911936adc7

View File

@ -0,0 +1,14 @@
PORT_DIR := $(call port_dir,$(REP_DIR)/ports/qt6)
MIRROR_LIB_SYMBOLS := libQt6Svg
content: $(MIRROR_LIB_SYMBOLS)
$(MIRROR_LIB_SYMBOLS):
mkdir -p lib/symbols
cp $(PORT_DIR)/src/lib/qt6/genode/api/lib/symbols/$@ lib/symbols/
content: LICENSE
LICENSE:
cp $(PORT_DIR)/src/lib/qt6/LICENSE.LGPL3 $@

View File

@ -0,0 +1 @@
2024-08-13 b019a06ae7a5361afab6fbde1d2f81911936adc7

View File

@ -0,0 +1,14 @@
content: qt6_dejavusans.tar LICENSE
PORT_DIR := $(call port_dir,$(REP_DIR)/ports/qt6)
qt/lib/fonts/DejaVuSans.ttf:
mkdir -p $(dir $@)
cp $(PORT_DIR)/src/lib/qt6/qtbase/src/3rdparty/wasm/$(notdir $@) $@
qt6_dejavusans.tar: qt/lib/fonts/DejaVuSans.ttf
tar --owner=0 --group=0 --numeric-owner --mode='go=' --mtime='1970-01-01 00:00+00' -cf $@ qt
rm -rf qt
LICENSE:
cp $(PORT_DIR)/src/lib/qt6/qtbase/src/3rdparty/wasm/DEJAVU-LICENSE $@

View File

@ -0,0 +1 @@
2024-08-07 38b1c2c107e85224612d1997f05e80e65b1e70f0

View File

@ -0,0 +1,32 @@
content: qt6_samegame.tar
PORT_DIR := $(call port_dir,$(REP_DIR)/ports/qt6)
SAMEGAME3_RESOURCES := samegame.qml \
Dialog.qml \
Button.qml \
Block.qml \
samegame.js
SAMEGAME_RESOURCES := background.jpg \
blueStone.png \
greenStone.png \
redStone.png
samegame:
mkdir -p $@
samegame/pics:
mkdir -p $@
$(addprefix samegame/, $(SAMEGAME3_RESOURCES)): samegame
cp $(PORT_DIR)/src/lib/qt6/qtdeclarative/examples/quick/tutorials/samegame/samegame3/$(notdir $@) $@
$(addprefix samegame/pics/, $(SAMEGAME_RESOURCES)): samegame/pics
cp $(PORT_DIR)/src/lib/qt6/qtdeclarative/examples/quick/tutorials/samegame/samegame3/pics/$(notdir $@) $@
qt6_samegame.tar: $(addprefix samegame/, $(SAMEGAME3_RESOURCES)) \
$(addprefix samegame/pics/, $(SAMEGAME_RESOURCES))
tar --owner=0 --group=0 --numeric-owner --mode='go=' --mtime='1970-01-01 00:00+00' -cf $@ -C samegame .
rm -rf samegame/

View File

@ -0,0 +1 @@
2024-08-14 d1e0a594a9f6c6ed6f6ce1b54afd2ac9ef8c86dd

View File

@ -0,0 +1 @@
qt6_base

View File

@ -0,0 +1,29 @@
MIRROR_FROM_REP_DIR := lib/mk/qt6_base.mk
content: $(MIRROR_FROM_REP_DIR)
$(MIRROR_FROM_REP_DIR):
$(mirror_from_rep_dir)
PORT_DIR := $(call port_dir,$(REP_DIR)/ports/qt6)
MIRROR_FROM_PORT_DIR := src/lib/qt6/qtbase
content: $(MIRROR_FROM_PORT_DIR)
$(MIRROR_FROM_PORT_DIR):
mkdir -p $(dir $@)
cp -r $(PORT_DIR)/$@ $(dir $@)
MIRROR_FROM_OS := include/pointer/shape_report.h
content: $(MIRROR_FROM_OS)
$(MIRROR_FROM_OS):
mkdir -p $(dir $@)
cp -r $(GENODE_DIR)/repos/os/$@ $(dir $@)
content: LICENSE
LICENSE:
cp $(PORT_DIR)/src/lib/qt6/LICENSE.LGPL3 $@

View File

@ -0,0 +1 @@
2024-08-07 a283d25ca59402458edd6637d3f6d6d0110462a1

View File

@ -0,0 +1,15 @@
base
blit
expat
framebuffer_session
gui_session
input_session
libc
mesa
os
qoost
qt6_component
report_session
so
stdcxx
timer_session

View File

@ -0,0 +1,20 @@
MIRROR_FROM_REP_DIR := src/app/qt6/examples/calculatorform
content: $(MIRROR_FROM_REP_DIR) LICENSE
$(MIRROR_FROM_REP_DIR):
$(mirror_from_rep_dir)
PORT_DIR := $(call port_dir,$(REP_DIR)/ports/qt6)
MIRROR_FROM_PORT_DIR := src/lib/qt6/qttools/examples/designer/calculatorform
content: $(MIRROR_FROM_PORT_DIR)
$(MIRROR_FROM_PORT_DIR):
mkdir -p $(dir $@)
cp -r $(PORT_DIR)/$@ $(dir $@)
LICENSE:
cp $(PORT_DIR)/src/lib/qt6/LICENSE.GPL3 $@

View File

@ -0,0 +1 @@
2024-08-07 13465c2fe1317113b33085babc73e5f87501867a

View File

@ -0,0 +1,6 @@
libc
mesa
qt6_base
qt6_component
so
stdcxx

View File

@ -0,0 +1 @@
qt6_component

View File

@ -0,0 +1,10 @@
MIRROR_FROM_REP_DIR := lib/mk/qt6_component.mk \
src/lib/qt6_component/qt_component.cc
content: $(MIRROR_FROM_REP_DIR) LICENSE
$(MIRROR_FROM_REP_DIR):
$(mirror_from_rep_dir)
LICENSE:
cp $(GENODE_DIR)/LICENSE $@

View File

@ -0,0 +1 @@
2024-06-19 57ef88b3254475486e091dc8f0f954d2f9528cba

View File

@ -0,0 +1,3 @@
base
libc
so

View File

@ -0,0 +1 @@
qt6_declarative

View File

@ -0,0 +1,21 @@
MIRROR_FROM_REP_DIR := lib/mk/qt6_declarative.mk
content: $(MIRROR_FROM_REP_DIR)
$(MIRROR_FROM_REP_DIR):
$(mirror_from_rep_dir)
PORT_DIR := $(call port_dir,$(REP_DIR)/ports/qt6)
MIRROR_FROM_PORT_DIR := src/lib/qt6/qtdeclarative
content: $(MIRROR_FROM_PORT_DIR)
$(MIRROR_FROM_PORT_DIR):
mkdir -p $(dir $@)
cp -r $(PORT_DIR)/$@ $(dir $@)
content: LICENSE
LICENSE:
cp $(PORT_DIR)/src/lib/qt6/LICENSE.LGPL3 $@

View File

@ -0,0 +1 @@
2024-08-13 0823c7e39fe4c746ee577f1067992139bb73e731

View File

@ -0,0 +1,6 @@
libc
mesa
qt6_base
qt6_component
so
stdcxx

View File

@ -0,0 +1,27 @@
MIRROR_FROM_REP_DIR := src/app/qt6/qt_launchpad
content: $(MIRROR_FROM_REP_DIR) LICENSE
$(MIRROR_FROM_REP_DIR):
$(mirror_from_rep_dir)
MIRROR_FROM_DEMO := include/launchpad \
lib/mk/launchpad.mk \
src/lib/launchpad
content: $(MIRROR_FROM_DEMO)
$(MIRROR_FROM_DEMO):
mkdir -p $(dir $@)
cp -r $(GENODE_DIR)/repos/demo/$@ $(dir $@)
MIRROR_FROM_OS := include/init/child_policy.h
content: $(MIRROR_FROM_OS)
$(MIRROR_FROM_OS):
mkdir -p $(dir $@)
cp -r $(GENODE_DIR)/repos/os/$@ $(dir $@)
LICENSE:
cp $(GENODE_DIR)/LICENSE $@

View File

@ -0,0 +1 @@
2024-08-07 1299305e19d2c766c212224b796691fb690a740e

View File

@ -0,0 +1,9 @@
base
libc
mesa
os
qt6_base
qt6_component
stdcxx
timer_session
vfs

View File

@ -0,0 +1,20 @@
MIRROR_FROM_REP_DIR := src/app/qt6/examples/openglwindow
content: $(MIRROR_FROM_REP_DIR) LICENSE
$(MIRROR_FROM_REP_DIR):
$(mirror_from_rep_dir)
PORT_DIR := $(call port_dir,$(REP_DIR)/ports/qt6)
MIRROR_FROM_PORT_DIR := src/lib/qt6/qtbase/examples/opengl/openglwindow
content: $(MIRROR_FROM_PORT_DIR)
$(MIRROR_FROM_PORT_DIR):
mkdir -p $(dir $@)
cp -r $(PORT_DIR)/$@ $(dir $@)
LICENSE:
cp $(PORT_DIR)/src/lib/qt6/LICENSE.GPL3 $@

View File

@ -0,0 +1 @@
2024-08-07 5ef331819960c41bda9d050f7dd8c7f73b76d134

View File

@ -0,0 +1,5 @@
libc
mesa
qt6_base
qt6_component
stdcxx

View File

@ -0,0 +1,9 @@
MIRROR_FROM_REP_DIR := src/app/qt6/examples/samegame
content: $(MIRROR_FROM_REP_DIR) LICENSE
$(MIRROR_FROM_REP_DIR):
$(mirror_from_rep_dir)
LICENSE:
cp $(GENODE_DIR)/LICENSE $@

View File

@ -0,0 +1 @@
2024-08-14 eadc4679251c14144de7ea807f2ffe25d96d437b

View File

@ -0,0 +1,6 @@
libc
mesa
qt6_base
qt6_component
qt6_declarative
stdcxx

View File

@ -0,0 +1 @@
qt6_shadertools

View File

@ -0,0 +1,21 @@
MIRROR_FROM_REP_DIR := lib/mk/qt6_shadertools.mk
content: $(MIRROR_FROM_REP_DIR)
$(MIRROR_FROM_REP_DIR):
$(mirror_from_rep_dir)
PORT_DIR := $(call port_dir,$(REP_DIR)/ports/qt6)
MIRROR_FROM_PORT_DIR := src/lib/qt6/qtshadertools
content: $(MIRROR_FROM_PORT_DIR)
$(MIRROR_FROM_PORT_DIR):
mkdir -p $(dir $@)
cp -r $(PORT_DIR)/$@ $(dir $@)
content: LICENSE
LICENSE:
cp $(PORT_DIR)/src/lib/qt6/LICENSE.LGPL3 $@

View File

@ -0,0 +1 @@
2024-08-13 0823c7e39fe4c746ee577f1067992139bb73e731

View File

@ -0,0 +1,6 @@
libc
mesa
qt6_base
qt6_component
so
stdcxx

View File

@ -0,0 +1 @@
qt6_svg

View File

@ -0,0 +1,21 @@
MIRROR_FROM_REP_DIR := lib/mk/qt6_svg.mk
content: $(MIRROR_FROM_REP_DIR)
$(MIRROR_FROM_REP_DIR):
$(mirror_from_rep_dir)
PORT_DIR := $(call port_dir,$(REP_DIR)/ports/qt6)
MIRROR_FROM_PORT_DIR := src/lib/qt6/qtsvg
content: $(MIRROR_FROM_PORT_DIR)
$(MIRROR_FROM_PORT_DIR):
mkdir -p $(dir $@)
cp -r $(PORT_DIR)/$@ $(dir $@)
content: LICENSE
LICENSE:
cp $(PORT_DIR)/src/lib/qt6/LICENSE.LGPL3 $@

View File

@ -0,0 +1 @@
2024-08-13 0823c7e39fe4c746ee577f1067992139bb73e731

Some files were not shown because too many files have changed in this diff Show More