Compare commits

...

1 Commits

Author SHA1 Message Date
Vladislav Nepogodin 0aef4b8275
👷 add gtk4 branch 2022-05-21 02:18:40 +04:00
6 changed files with 601 additions and 638 deletions

View File

@ -23,17 +23,18 @@ pkg_check_modules(
GTKMM
REQUIRED
IMPORTED_TARGET
gtkmm-3.0)
gtkmm-4.0)
FetchContent_Declare(fmt
GIT_REPOSITORY "https://github.com/fmtlib/fmt.git"
GIT_TAG "3b6e409cd8573f63e4acad7717d9082bd898ec87"
GIT_TAG "a44716f58e943905d1357160b98cae2618d053cf"
)
FetchContent_MakeAvailable(fmt)
##
## CONFIGURATION
##
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,--export-dynamic")
set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -flto")
if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")

View File

@ -1,18 +1,35 @@
project('cachyos-hello', 'cpp',
version: '0.6.10',
version: '0.6.9',
license: 'GPLv3',
meson_version: '>=0.55.0',
default_options: ['cpp_std=c++17',
'buildtype=debugoptimized',
'warning_level=3',
'werror=true',
'werror=false',
'b_ndebug=if-release'])
is_debug_build = get_option('buildtype').startswith('debug')
cc = meson.get_compiler('cpp')
if cc.get_id() == 'clang'
specific_cc_flags = [
'-nostdlib++',
#'-stdlib=libc++',
'-nodefaultlibs',
]
specific_link_flags = [
'-fuse-ld=lld',
]
add_global_arguments(cc.get_supported_arguments(specific_cc_flags), language : 'cpp')
add_global_link_arguments(cc.get_supported_link_arguments(specific_link_flags), language : 'cpp')
endif
if is_debug_build
add_global_arguments('-D_GLIBCXX_ASSERTIONS', language : 'cpp')
endif
# Common dependencies
fmt = dependency('fmt', version : ['>=8.0.0'], fallback : ['fmt', 'fmt_dep'])
gtkmm = dependency('gtkmm-3.0', version : ['>=3.22.0'])
gtkmm = dependency('gtkmm-4.0', version : ['>=1.8.0'])
src_files = files(
'src/hello.cpp', 'src/hello.hpp',
@ -24,16 +41,19 @@ possible_cc_flags = [
'-Wnon-virtual-dtor',
'-Wold-style-cast',
'-Wcast-align',
'-Wunused',
'-Woverloaded-virtual',
'-Wpedantic', # non-standard C++
'-Wconversion', # type conversion that may lose data
'-Wsign-conversion',
'-Wnull-dereference',
'-Wdouble-promotion', # float to double
'-Wformat=2',
'-Wimplicit-fallthrough', # fallthrough without an explicit annotation
]
if cc.get_id() == 'gcc'
@ -43,20 +63,39 @@ if cc.get_id() == 'gcc'
'-Wduplicated-cond',
'-Wduplicated-branches',
'-Wlogical-op',
'-Wuseless-cast',
'-Wsuggest-attribute=cold',
'-Wsuggest-attribute=format',
'-Wsuggest-attribute=malloc',
'-Wsuggest-attribute=noreturn',
'-Wsuggest-attribute=pure',
'-Wsuggest-final-methods',
'-Wsuggest-final-types',
'-Wdiv-by-zero',
'-Wanalyzer-double-fclose',
'-Wanalyzer-double-free',
'-Wanalyzer-malloc-leak',
'-Wanalyzer-use-after-free',
]
endif
if get_option('buildtype') != 'debug'
if not is_debug_build
if cc.get_id() == 'gcc'
possible_cc_flags += [
'-flto',
'-fwhole-program',
'-fuse-linker-plugin',
]
else
possible_cc_flags += [
'-flto=thin',
]
endif
possible_cc_flags += ['-fdata-sections', '-ffunction-sections']
possible_link_flags = ['-Wl,--gc-sections', '-Wl,--export-dynamic']
add_project_link_arguments(cc.get_supported_link_arguments(possible_link_flags), language : 'cpp')
endif
add_project_arguments(cc.get_supported_arguments(possible_cc_flags), language : 'cpp')

View File

@ -99,19 +99,19 @@ void quick_message(Gtk::Window* parent, const std::string& message) {
auto* label = gtk_label_new(message.c_str());
// Add the label, and show everything weve added
gtk_container_add(GTK_CONTAINER(content_area), label);
gtk_widget_show_all(dialog);
gtk_box_append(GTK_BOX(content_area), label);
gtk_widget_show(dialog);
int result = gtk_dialog_run(GTK_DIALOG(dialog));
// int result = gtk_dialog_run(GTK_DIALOG(dialog));
std::vector<std::string> argv{};
if (result == GTK_RESPONSE_NO) {
argv = {fix_path("/usr/local/bin/calamares-offline.sh")};
} else if (result == GTK_RESPONSE_YES) {
argv = {fix_path("/usr/local/bin/calamares-online.sh")};
} else {
gtk_widget_destroy(dialog);
return;
}
// if (result == GTK_RESPONSE_NO) {
// argv = {fix_path("/usr/local/bin/calamares-offline.sh")};
// } else if (result == GTK_RESPONSE_YES) {
// argv = {fix_path("/usr/local/bin/calamares-online.sh")};
// } else {
// gtk_window_destroy(GTK_WINDOW(dialog));
// return;
// }
int child_stdout{};
int child_stderr{};
@ -119,31 +119,28 @@ void quick_message(Gtk::Window* parent, const std::string& message) {
// Spawn child process.
try {
Glib::spawn_async_with_pipes(".", argv, Glib::SpawnFlags::SPAWN_DO_NOT_REAP_CHILD, Glib::SlotSpawnChildSetup(), &child_pid, nullptr, &child_stdout, &child_stderr);
Glib::spawn_async_with_pipes(".", argv, Glib::SpawnFlags::DO_NOT_REAP_CHILD, Glib::SlotSpawnChildSetup(), &child_pid, nullptr, &child_stdout, &child_stderr);
} catch (Glib::Error& error) {
g_critical("%s", error.what().c_str());
g_critical("%s", error.what());
}
// Add a child watch function which will be called when the child process
// exits.
g_child_watch_add(child_pid, child_watch_cb, nullptr);
gtk_widget_destroy(dialog);
gtk_window_destroy(GTK_WINDOW(dialog));
}
} // namespace
Hello::Hello(int argc, char** argv) {
Hello::Hello(bool is_dev) {
set_title("CachyOS Hello");
set_border_width(6);
if (argc > 1 && (strncmp(argv[1], "--dev", 5) == 0)) {
m_dev = true;
}
// set_border_width(6);
g_refHello = this;
auto screen = Gdk::Screen::get_default();
// auto screen = Gdk::Screen::get_default();
// Load preferences
if (m_dev) {
if (is_dev) {
m_preferences = read_json("data/preferences.json");
m_preferences["data_path"] = "data/";
m_preferences["desktop_path"] = fmt::format("{}/{}.desktop", fs::current_path().string(), m_app);
@ -159,54 +156,55 @@ Hello::Hello(int argc, char** argv) {
m_save = (!fs::exists(save_path)) ? nlohmann::json({{"locale", ""}}) : read_json(save_path);
// Import Css
auto provider = Gtk::CssProvider::create();
provider->load_from_path(m_preferences["style_path"]);
Gtk::StyleContext::add_provider_for_screen(screen, provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
// auto provider = Gtk::CssProvider::create();
// provider->load_from_path(m_preferences["style_path"]);
// Gtk::StyleContext::add_provider_for_screen(screen, provider, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION);
// Init window
m_builder = Gtk::Builder::create_from_file(m_preferences["ui_path"]);
gtk_builder_add_callback_symbol(m_builder->gobj(), "on_languages_changed", G_CALLBACK(on_languages_changed));
gtk_builder_add_callback_symbol(m_builder->gobj(), "on_action_clicked", G_CALLBACK(on_action_clicked));
gtk_builder_add_callback_symbol(m_builder->gobj(), "on_btn_clicked", G_CALLBACK(on_btn_clicked));
gtk_builder_add_callback_symbol(m_builder->gobj(), "on_link_clicked", G_CALLBACK(on_link_clicked));
gtk_builder_add_callback_symbol(m_builder->gobj(), "on_delete_window", G_CALLBACK(on_delete_window));
gtk_builder_connect_signals(m_builder->gobj(), nullptr);
Gtk::Window* ref_window;
m_builder->get_widget("window", ref_window);
// auto* scope = gtk_builder_get_scope(m_builder->gobj());
// gtk_builder_cscope_add_callback_symbols(scope, "on_languages_changed", G_CALLBACK(on_languages_changed));
// gtk_builder_add_callback_symbol(m_builder->gobj(), "on_languages_changed", G_CALLBACK(on_languages_changed));
// gtk_builder_add_callback_symbol(m_builder->gobj(), "on_action_clicked", G_CALLBACK(on_action_clicked));
// gtk_builder_add_callback_symbol(m_builder->gobj(), "on_btn_clicked", G_CALLBACK(on_btn_clicked));
// gtk_builder_add_callback_symbol(m_builder->gobj(), "on_link_clicked", G_CALLBACK(on_link_clicked));
// gtk_builder_add_callback_symbol(m_builder->gobj(), "on_delete_window", G_CALLBACK(on_delete_window));
// gtk_builder_connect_signals(m_builder->gobj(), nullptr);
auto* ref_window = m_builder->get_widget<Gtk::Window>("window");
gobject_ = reinterpret_cast<GObject*>(ref_window->gobj());
// Subtitle of headerbar
Gtk::HeaderBar* header;
m_builder->get_widget("headerbar", header);
auto* header = m_builder->get_widget<Gtk::HeaderBar>("headerbar");
const auto& lsb_info = get_lsb_infos();
header->set_subtitle(lsb_info[0] + " " + lsb_info[1]);
// header->set_title_widget(Gtk::Label(lsb_info[0] + " " + lsb_info[1], false));
// header->set_subtitle(lsb_info[0] + " " + lsb_info[1]);
// Load images
if (fs::is_regular_file(m_preferences["logo_path"])) {
const auto& logo = Gdk::Pixbuf::create_from_file(m_preferences["logo_path"]);
set_icon(logo);
// const std::string& logo = m_preferences["logo_path"];
// set_icon(logo);
// Glib::Error err;
// auto* native_er = err.gobj();
// gtk_window_set_icon_from_file(this->gobj(), logo.c_str(), &native_er);
Gtk::Image* image;
m_builder->get_widget("distriblogo", image);
image->set(logo);
// auto* image = m_builder->get_widget<Gtk::Image>("distriblogo");
// image->set(logo);
Gtk::AboutDialog* dialog;
m_builder->get_widget("aboutdialog", dialog);
dialog->set_logo(logo);
// auto* dialog = m_builder->get_widget<Gtk::AboutDialog>("aboutdialog");
// dialog->set_logo(logo);
}
Gtk::Box* social_box;
m_builder->get_widget("social", social_box);
/*
auto* social_box = m_builder->get_widget<Gtk::Box>("social");
for (const auto& btn : social_box->get_children()) {
const auto& name = btn->get_name();
const auto& icon_path = fmt::format("{}img/{}.png", m_preferences["data_path"], name.c_str());
Gtk::Image* image;
m_builder->get_widget(name, image);
auto* image = m_builder->get_widget<Gtk::Image>(name);
image->set(icon_path);
}
}*/
Gtk::Grid* homepage_grid;
m_builder->get_widget("homepage", homepage_grid);
/*auto* homepage_grid = m_builder->get_widget<Gtk::Grid>("homepage");
for (const auto& widget : homepage_grid->get_children()) {
if (!G_TYPE_CHECK_INSTANCE_TYPE(widget->gobj(), GTK_TYPE_BUTTON)) {
continue;
@ -221,29 +219,29 @@ Hello::Hello(int argc, char** argv) {
image.set(image_path);
image.set_margin_start(2);
casted_widget->set_image(image);
}
}*/
// Create pages
m_pages = fmt::format("{}pages/{}", m_preferences["data_path"], m_preferences["default_locale"]);
for (const auto& page : fs::directory_iterator(m_pages)) {
auto* scrolled_window = gtk_scrolled_window_new(nullptr, nullptr);
auto* scrolled_window = gtk_scrolled_window_new();
auto* viewport = gtk_viewport_new(nullptr, nullptr);
gtk_container_set_border_width(GTK_CONTAINER(viewport), 10);
// gtk_container_set_border_width(GTK_CONTAINER(viewport), 10);
auto* label = gtk_label_new(nullptr);
gtk_label_set_line_wrap(GTK_LABEL(label), true);
auto* image = gtk_image_new_from_icon_name("go-previous", GTK_ICON_SIZE_BUTTON);
gtk_label_set_wrap(GTK_LABEL(label), true);
auto* image = gtk_image_new_from_icon_name("go-previous");
auto* backBtn = gtk_button_new();
gtk_button_set_image(GTK_BUTTON(backBtn), image);
gtk_button_set_child(GTK_BUTTON(backBtn), image);
gtk_widget_set_name(backBtn, "home");
g_signal_connect(backBtn, "clicked", G_CALLBACK(&on_btn_clicked), nullptr);
auto* grid = GTK_GRID(gtk_grid_new());
gtk_grid_attach(grid, backBtn, 0, 1, 1, 1);
gtk_grid_attach(grid, label, 1, 2, 1, 1);
gtk_container_add(GTK_CONTAINER(viewport), GTK_WIDGET(grid));
gtk_container_add(GTK_CONTAINER(scrolled_window), GTK_WIDGET(viewport));
gtk_widget_show_all(scrolled_window);
gtk_box_append(GTK_BOX(viewport), GTK_WIDGET(grid));
gtk_box_append(GTK_BOX(scrolled_window), GTK_WIDGET(viewport));
gtk_widget_show(scrolled_window);
Glib::RefPtr<Glib::Object> stack = m_builder->get_object("stack");
const auto& child_name = page.path().filename().string() + "page";
@ -252,26 +250,23 @@ Hello::Hello(int argc, char** argv) {
// Init translation
const std::string& locale_path = m_preferences["locale_path"];
setlocale(LC_ALL, "");
bindtextdomain(m_app, locale_path.c_str());
bind_textdomain_codeset(m_app, "UTF-8");
textdomain(m_app);
Gtk::ComboBoxText* languages;
m_builder->get_widget("languages", languages);
auto* languages = m_builder->get_widget<Gtk::ComboBoxText>("languages");
languages->set_active_id(get_best_locale());
// Set autostart switcher state
m_autostart = fs::exists(fix_path(m_preferences["autostart_path"]));
Gtk::Switch* autostart_switch;
m_builder->get_widget("autostart", autostart_switch);
auto* autostart_switch = m_builder->get_widget<Gtk::Switch>("autostart");
autostart_switch->set_active(m_autostart);
// Live systems
if (fs::exists(m_preferences["live_path"]) && fs::is_regular_file(m_preferences["installer_path"])) {
Gtk::Label* installlabel;
m_builder->get_widget("installlabel", installlabel);
auto* installlabel = m_builder->get_widget<Gtk::Label>("installlabel");
installlabel->set_visible(true);
Gtk::Button* install;
m_builder->get_widget("install", install);
auto* install = m_builder->get_widget<Gtk::Button>("install");
install->set_visible(true);
}
}
@ -361,8 +356,7 @@ void Hello::set_locale(const std::string_view& use_locale) noexcept {
}
for (const auto& elt : elts[method.key()].items()) {
const std::string& elt_value = elt.value();
Gtk::Widget* item;
m_builder->get_widget(elt_value, item);
auto* item = m_builder->get_widget<Gtk::Widget>(elt_value);
if (!m_default_texts[method.key()].contains(elt_value)) {
gchar* item_buf;
g_object_get(G_OBJECT(item->gobj()), method.key().c_str(), &item_buf, nullptr);
@ -377,19 +371,18 @@ void Hello::set_locale(const std::string_view& use_locale) noexcept {
// Change content of pages
for (const auto& page : fs::directory_iterator(m_pages)) {
Gtk::Stack* stack;
m_builder->get_widget("stack", stack);
auto* stack = m_builder->get_widget<Gtk::Stack>("stack");
const auto& child = stack->get_child_by_name((page.path().filename().string() + "page").c_str());
if (child == nullptr) {
fmt::print(stderr, "child not found\n");
continue;
}
const auto& first_child = reinterpret_cast<Gtk::Container*>(child)->get_children();
const auto& second_child = reinterpret_cast<Gtk::Container*>(first_child[0])->get_children();
const auto& third_child = reinterpret_cast<Gtk::Container*>(second_child[0])->get_children();
// const auto& first_child = reinterpret_cast<Gtk::Container*>(child)->get_children();
// const auto& second_child = reinterpret_cast<Gtk::Container*>(first_child[0])->get_children();
// const auto& third_child = reinterpret_cast<Gtk::Container*>(second_child[0])->get_children();
const auto& label = reinterpret_cast<Gtk::Label*>(third_child[0]);
label->set_markup(get_page(page.path().filename().string()));
// const auto& label = reinterpret_cast<Gtk::Label*>(third_child[0]);
// label->set_markup(get_page(page.path().filename().string()));
}
}
@ -434,23 +427,20 @@ void Hello::on_action_clicked(GtkWidget* widget) noexcept {
return;
}
Gtk::AboutDialog* dialog;
g_refHello->m_builder->get_widget("aboutdialog", dialog);
auto* dialog = g_refHello->m_builder->get_widget<Gtk::AboutDialog>("aboutdialog");
dialog->set_decorated(false);
dialog->run();
dialog->hide();
}
void Hello::on_btn_clicked(GtkWidget* widget) noexcept {
const auto& name = gtk_widget_get_name(widget);
Gtk::Stack* stack;
g_refHello->m_builder->get_widget("stack", stack);
auto* stack = g_refHello->m_builder->get_widget<Gtk::Stack>("stack");
stack->set_visible_child(fmt::format("{}page", name).c_str());
}
void Hello::on_link_clicked(GtkWidget* widget) noexcept {
const auto& name = gtk_widget_get_name(widget);
const std::string uri = g_refHello->m_preferences["urls"][name];
gtk_show_uri_on_window(nullptr, uri.c_str(), GDK_CURRENT_TIME, nullptr);
gtk_show_uri(nullptr, uri.c_str(), GDK_CURRENT_TIME);
}
void Hello::on_delete_window(GtkWidget* /*widget*/) noexcept {
write_json(g_refHello->m_preferences["save_path"].get<std::string>(), g_refHello->m_save);

View File

@ -1,12 +1,32 @@
#ifndef HELLO_HPP_
#define HELLO_HPP_
#if defined(__clang__)
#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wold-style-cast"
#pragma clang diagnostic ignored "-Wsign-conversion"
#pragma clang diagnostic ignored "-Wdouble-promotion"
#else
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wold-style-cast"
#pragma GCC diagnostic ignored "-Wdouble-promotion"
#pragma GCC diagnostic ignored "-Wuseless-cast"
#pragma GCC diagnostic ignored "-Wsign-conversion"
#endif
#include <gtkmm.h>
#if defined(__clang__)
#pragma clang diagnostic pop
#else
#pragma GCC diagnostic pop
#endif
#include <json.hpp>
class Hello final : public Gtk::Window {
public:
Hello(int argc, char** argv);
Hello(bool is_dev);
protected:
// Handlers

View File

@ -3,8 +3,8 @@
int main(int argc, char** argv) {
auto app = Gtk::Application::create();
Hello hello(argc, argv);
const bool is_dev = 1;
// Shows the window and returns when it is closed.
return app->run(hello);
return app->make_window_and_run<Hello>(argc, argv, is_dev);
}

View File

@ -1,304 +1,240 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2
Copyright (C) 2021-2022 CachyOS team
This file is part of cachyos-welcome.
cachyos-welcome is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
cachyos-welcome is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with cachyos-welcome. If not, see <http://www.gnu.org/licenses/>.
-->
<interface domain="cachyos-hello">
<requires lib="gtk+" version="3.20"/>
<!-- interface-css-provider-path style.css -->
<!-- interface-license-type gplv3 -->
<!-- interface-name cachyos-welcome -->
<!-- interface-copyright 2021-2022 CachyOS team -->
<interface>
<requires lib="gtk" version="4.0"/>
<object class="GtkImage" id="abouticon">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="icon-name">help-about</property>
</object>
<object class="GtkWindow" id="window">
<property name="can-focus">False</property>
<property name="window-position">center</property>
<property name="default-width">800</property>
<property name="default-height">500</property>
<property name="has-resize-grip">True</property>
<signal name="delete-event" handler="on_delete_window" swapped="no"/>
<child>
<property name="child">
<object class="GtkStack" id="stack">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="hexpand">True</property>
<property name="hexpand">1</property>
<property name="transition-type">crossfade</property>
<child>
<!-- n-columns=3 n-rows=11 -->
<object class="GtkStackPage">
<property name="name">homepage</property>
<property name="child">
<object class="GtkGrid" id="homepage">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="margin-left">10</property>
<property name="margin-right">10</property>
<property name="margin-start">10</property>
<property name="margin-end">10</property>
<property name="margin-top">10</property>
<property name="margin-bottom">10</property>
<property name="row-spacing">20</property>
<property name="column-spacing">10</property>
<property name="column-homogeneous">True</property>
<property name="column-homogeneous">1</property>
<child>
<object class="GtkImage" id="distriblogo">
<property name="visible">True</property>
<property name="can-focus">False</property>
<layout>
<property name="column">0</property>
<property name="row">1</property>
<property name="column-span">3</property>
</layout>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">1</property>
<property name="width">3</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="welcometitle">
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="has-focus">True</property>
<property name="label" translatable="yes">Welcome to CachyOS!</property>
<property name="focusable">1</property>
<property name="has-focus">1</property>
<property name="label" translatable="1">Welcome to CachyOS!</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="scale" value="2"/>
<attribute name="weight" value="bold"></attribute>
<attribute name="scale" value="2"></attribute>
</attributes>
<layout>
<property name="column">0</property>
<property name="row">2</property>
<property name="column-span">3</property>
</layout>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">2</property>
<property name="width">3</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="welcomelabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">Thank you for joining our community!
<property name="label" translatable="1">Thank you for joining our community!
We, the CachyOS Developers, hope that you will enjoy using CachyOS as much as we enjoy building it. The links below will help you get started with your new operating system. So enjoy the experience, and don't hesitate to send us your feedback.</property>
We, the CachyOS Developers, hope that you will enjoy using CachyOS as much as we enjoy building it. The links below will help you get started with your new operating system. So enjoy the experience, and don&apos;t hesitate to send us your feedback.</property>
<property name="justify">fill</property>
<property name="wrap">True</property>
<property name="wrap">1</property>
<property name="width-chars">1</property>
<property name="max-width-chars">1</property>
<layout>
<property name="column">0</property>
<property name="row">3</property>
<property name="column-span">3</property>
</layout>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">3</property>
<property name="width">3</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="firstcategory">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">DOCUMENTATION</property>
<property name="label" translatable="1">DOCUMENTATION</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="weight" value="bold"></attribute>
</attributes>
<layout>
<property name="column">0</property>
<property name="row">4</property>
</layout>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">4</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="secondcategory">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">SUPPORT</property>
<property name="label" translatable="1">SUPPORT</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="weight" value="bold"></attribute>
</attributes>
<layout>
<property name="column">1</property>
<property name="row">4</property>
</layout>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">4</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="thirdcategory">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">PROJECT</property>
<property name="label" translatable="1">PROJECT</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="weight" value="bold"></attribute>
</attributes>
<layout>
<property name="column">2</property>
<property name="row">4</property>
</layout>
</object>
<packing>
<property name="left-attach">2</property>
<property name="top-attach">4</property>
</packing>
</child>
<child>
<object class="GtkButton" id="readme">
<property name="label" translatable="yes">Read me</property>
<property name="label" translatable="1">Read me</property>
<property name="name">readme</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="receives-default">True</property>
<property name="receives-default">1</property>
<signal name="clicked" handler="on_btn_clicked" swapped="no"/>
<layout>
<property name="column">0</property>
<property name="row">5</property>
</layout>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">5</property>
</packing>
</child>
<child>
<object class="GtkButton" id="release">
<property name="label" translatable="yes">Release info</property>
<property name="label" translatable="1">Release info</property>
<property name="name">release</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="receives-default">True</property>
<property name="receives-default">1</property>
<property name="always-show-image">True</property>
<signal name="clicked" handler="on_btn_clicked" swapped="no"/>
<layout>
<property name="column">0</property>
<property name="row">6</property>
</layout>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">6</property>
</packing>
</child>
<child>
<object class="GtkButton" id="wiki">
<property name="label" translatable="yes">Wiki</property>
<property name="label" translatable="1">Wiki</property>
<property name="name">wiki</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="receives-default">True</property>
<property name="tooltip-text" translatable="yes">Web resource</property>
<property name="receives-default">1</property>
<property name="tooltip-text" translatable="1">Web resource</property>
<property name="image-position">right</property>
<property name="always-show-image">True</property>
<signal name="clicked" handler="on_link_clicked" swapped="no"/>
<layout>
<property name="column">0</property>
<property name="row">7</property>
</layout>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">7</property>
</packing>
</child>
<child>
<object class="GtkButton" id="involved">
<property name="label" translatable="yes">Get involved</property>
<property name="label" translatable="1">Get involved</property>
<property name="name">involved</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="receives-default">True</property>
<property name="receives-default">1</property>
<signal name="clicked" handler="on_btn_clicked" swapped="no"/>
<layout>
<property name="column">2</property>
<property name="row">5</property>
</layout>
</object>
<packing>
<property name="left-attach">2</property>
<property name="top-attach">5</property>
</packing>
</child>
<child>
<object class="GtkButton" id="forum">
<property name="label" translatable="yes">Forums</property>
<property name="label" translatable="1">Forums</property>
<property name="name">forum</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="receives-default">True</property>
<property name="tooltip-text" translatable="yes">Web resource</property>
<property name="receives-default">1</property>
<property name="tooltip-text" translatable="1">Web resource</property>
<property name="image-position">right</property>
<property name="always-show-image">True</property>
<signal name="clicked" handler="on_link_clicked" swapped="no"/>
<layout>
<property name="column">1</property>
<property name="row">5</property>
</layout>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">5</property>
</packing>
</child>
<child>
<object class="GtkButton" id="discover">
<property name="label" translatable="yes">Discover software</property>
<property name="label" translatable="1">Discover software</property>
<property name="name">discover</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="receives-default">True</property>
<property name="tooltip-text" translatable="yes">Web resource</property>
<property name="receives-default">1</property>
<property name="tooltip-text" translatable="1">Web resource</property>
<property name="image-position">right</property>
<property name="always-show-image">True</property>
<signal name="clicked" handler="on_link_clicked" swapped="no"/>
<layout>
<property name="column">1</property>
<property name="row">6</property>
</layout>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">6</property>
</packing>
</child>
<child>
<object class="GtkButton" id="mailling">
<property name="label" translatable="yes">Mailing lists</property>
<property name="label" translatable="1">Mailing lists</property>
<property name="name">mailling</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="receives-default">True</property>
<property name="tooltip-text" translatable="yes">Web resource</property>
<property name="receives-default">1</property>
<property name="tooltip-text" translatable="1">Web resource</property>
<property name="image-position">right</property>
<property name="always-show-image">True</property>
<signal name="clicked" handler="on_link_clicked" swapped="no"/>
<layout>
<property name="column">1</property>
<property name="row">7</property>
</layout>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">7</property>
</packing>
</child>
<child>
<object class="GtkButton" id="development">
<property name="label" translatable="yes">Development</property>
<property name="label" translatable="1">Development</property>
<property name="name">development</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="receives-default">True</property>
<property name="tooltip-text" translatable="yes">Web resource</property>
<property name="receives-default">1</property>
<property name="tooltip-text" translatable="1">Web resource</property>
<property name="image-position">right</property>
<property name="always-show-image">True</property>
<signal name="clicked" handler="on_link_clicked" swapped="no"/>
<layout>
<property name="column">2</property>
<property name="row">6</property>
</layout>
</object>
<packing>
<property name="left-attach">2</property>
<property name="top-attach">6</property>
</packing>
</child>
<child>
<object class="GtkButton" id="donate">
<property name="label" translatable="yes">Donate</property>
<property name="label" translatable="1">Donate</property>
<property name="name">donate</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="receives-default">True</property>
<property name="tooltip-text" translatable="yes">Web resource</property>
<property name="receives-default">1</property>
<property name="tooltip-text" translatable="1">Web resource</property>
<property name="image-position">right</property>
<property name="always-show-image">True</property>
<signal name="clicked" handler="on_link_clicked" swapped="no"/>
<layout>
<property name="column">2</property>
<property name="row">7</property>
</layout>
</object>
<packing>
<property name="left-attach">2</property>
<property name="top-attach">7</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="valign">end</property>
<property name="vexpand">True</property>
<property name="vexpand">1</property>
<property name="spacing">10</property>
<child>
<object class="GtkComboBoxText" id="languages">
<property name="visible">True</property>
<property name="can-focus">False</property>
<items>
<item id="sq">Albanian</item>
<item id="ar">Arabic</item>
@ -348,112 +284,97 @@ We, the CachyOS Developers, hope that you will enjoy using CachyOS as much as we
</items>
<signal name="changed" handler="on_languages_changed" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="autostartlabel">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="hexpand">1</property>
<property name="halign">end</property>
<property name="valign">center</property>
<property name="vexpand">True</property>
<property name="label" translatable="yes">Launch at start</property>
<property name="vexpand">1</property>
<property name="label" translatable="1">Launch at start</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
<child>
<object class="GtkSwitch" id="autostart">
<property name="halign">center</property>
<property name="name">autostart</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="focusable">1</property>
<property name="valign">center</property>
<property name="vexpand">True</property>
<property name="vexpand">1</property>
<signal name="notify::active" handler="on_action_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">2</property>
</packing>
</child>
<layout>
<property name="column">0</property>
<property name="row">10</property>
<property name="column-span">3</property>
</layout>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">10</property>
<property name="width">3</property>
</packing>
</child>
<child>
<object class="GtkLabel" id="installlabel">
<property name="can-focus">False</property>
<property name="label" translatable="yes">INSTALLATION</property>
<property name="visible">0</property>
<property name="label" translatable="1">INSTALLATION</property>
<attributes>
<attribute name="weight" value="bold"/>
<attribute name="weight" value="bold"></attribute>
</attributes>
<layout>
<property name="column">1</property>
<property name="row">8</property>
</layout>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">8</property>
</packing>
</child>
<child>
<object class="GtkButton" id="install">
<property name="label" translatable="yes">Launch installer</property>
<property name="visible">0</property>
<property name="label" translatable="1">Launch installer</property>
<property name="name">install</property>
<property name="can-focus">False</property>
<property name="receives-default">True</property>
<property name="receives-default">1</property>
<signal name="clicked" handler="on_action_clicked" swapped="no"/>
<layout>
<property name="column">1</property>
<property name="row">9</property>
</layout>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">9</property>
</packing>
</child>
<child>
<object class="GtkBox">
<property name="name">boxPlugins</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="homogeneous">True</property>
<property name="homogeneous">1</property>
<child>
<object class="GtkButton" id="appBrowser">
<property name="label" translatable="yes">Applications</property>
<property name="hexpand">1</property>
<property name="visible">0</property>
<property name="label" translatable="1">Applications</property>
<property name="name">appBrowser</property>
<property name="can-focus">False</property>
<property name="receives-default">True</property>
<property name="tooltip-text" translatable="yes">Common application selection</property>
<property name="margin-left">15</property>
<property name="margin-right">15</property>
<property name="receives-default">1</property>
<property name="tooltip-text" translatable="1">Common application selection</property>
<property name="margin-start">15</property>
<property name="margin-end">15</property>
<signal name="clicked" handler="on_btn_clicked" swapped="no"/>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<placeholder/>
</child>
<object class="GtkButton" id="appLayouts">
<property name="visible">0</property>
<property name="label" translatable="1">Gnome Layouts Manager</property>
<property name="name">appLayouts</property>
<property name="receives-default">1</property>
<property name="tooltip-text" translatable="1">CachyOS Gnome config tool</property>
<property name="margin-start">15</property>
<property name="margin-end">15</property>
<signal name="clicked" handler="on_btn_clicked" swapped="no"/>
</object>
</child>
<layout>
<property name="column">0</property>
<property name="row">9</property>
<property name="column-span">3</property>
</layout>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">9</property>
<property name="width">3</property>
</packing>
</child>
<child>
<object class="GtkBox" id="social">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="halign">center</property>
<property name="valign">end</property>
<property name="spacing">10</property>
@ -465,23 +386,36 @@ We, the CachyOS Developers, hope that you will enjoy using CachyOS as much as we
<signal name="button-press-event" handler="on_link_clicked" swapped="no"/>
<child>
<object class="GtkImage" id="telegram">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="tooltip-text">Telegram</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<placeholder/>
<object class="GtkEventBox">
<property name="name">facebook</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<signal name="button-press-event" handler="on_link_clicked" swapped="no"/>
<child>
<object class="GtkImage" id="facebook">
<property name="tooltip-text">Facebook</property>
</object>
</child>
</object>
</child>
<child>
<placeholder/>
<object class="GtkEventBox">
<property name="name">twitter</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<signal name="button-press-event" handler="on_link_clicked" swapped="no"/>
<child>
<object class="GtkImage" id="twitter">
<property name="tooltip-text">Twitter</property>
</object>
</child>
</object>
</child>
<child>
<object class="GtkEventBox">
@ -491,26 +425,19 @@ We, the CachyOS Developers, hope that you will enjoy using CachyOS as much as we
<signal name="button-press-event" handler="on_link_clicked" swapped="no"/>
<child>
<object class="GtkImage" id="reddit">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="tooltip-text">Reddit</property>
</object>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="position">3</property>
</packing>
</child>
<style>
<class name="social"/>
</style>
<layout>
<property name="column">1</property>
<property name="row">10</property>
</layout>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">10</property>
</packing>
</child>
<child>
<placeholder/>
@ -531,35 +458,25 @@ We, the CachyOS Developers, hope that you will enjoy using CachyOS as much as we
<class name="homepage"/>
</style>
</object>
<packing>
<property name="name">homepage</property>
</packing>
</child>
</property>
</object>
</child>
</object>
</property>
<child type="titlebar">
<object class="GtkHeaderBar" id="headerbar">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="title">CachyOS Hello</property>
<property name="show-close-button">True</property>
<child>
<placeholder/>
</child>
<child>
<child type="end">
<object class="GtkButton" id="about">
<property name="name">about</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="receives-default">True</property>
<property name="tooltip-text" translatable="yes">About</property>
<property name="receives-default">1</property>
<property name="tooltip-text" translatable="1">About</property>
<property name="image">abouticon</property>
<signal name="clicked" handler="on_action_clicked" swapped="no"/>
</object>
<packing>
<property name="pack-type">end</property>
<property name="position">1</property>
</packing>
</child>
<child>
<placeholder/>
@ -568,13 +485,12 @@ We, the CachyOS Developers, hope that you will enjoy using CachyOS as much as we
</child>
</object>
<object class="GtkAboutDialog" id="aboutdialog">
<property name="can-focus">False</property>
<property name="title" translatable="yes">About</property>
<property name="title" translatable="1">About</property>
<property name="type-hint">dialog</property>
<property name="transient-for">window</property>
<property name="program-name">CachyOS Hello</property>
<property name="version">0.6.10</property>
<property name="comments" translatable="yes">Welcome screen for CachyOS</property>
<property name="version">0.6.8</property>
<property name="comments" translatable="1">Welcome screen for CachyOS</property>
<property name="website">https://github.com/cachyos/cachyos-welcome</property>
<property name="website-label">GitHub</property>
<property name="authors">Hugo Posnic
@ -616,24 +532,21 @@ Stefano Capitani
Stéphane
Πέτρος Σαμαράς
Андрей Раугас</property>
<property name="logo-icon-name"/>
<property name="logo-icon-name"></property>
<property name="license-type">gpl-3-0</property>
<child internal-child="vbox">
<object class="GtkBox">
<property name="can-focus">True</property>
<property name="has-focus">True</property>
<property name="visible">0</property>
<property name="focusable">1</property>
<property name="has-focus">1</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child internal-child="action_area">
<object class="GtkButtonBox">
<property name="valign">center</property>
<property name="can-focus">False</property>
<property name="layout-style">end</property>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<placeholder/>