summaryrefslogtreecommitdiff
path: root/MenuApplets
diff options
context:
space:
mode:
authorAndreas Kling <kling@serenityos.org>2021-01-12 12:02:43 +0100
committerAndreas Kling <kling@serenityos.org>2021-01-12 12:04:20 +0100
commitb8d6a56fa354a268e3fbfa4fb6d146e9bf60103e (patch)
treecfabe710c85b5f26133609b25e2da223099607d4 /MenuApplets
parent7fc079bd86e066ec65ff7b9aed278a45a017baec (diff)
downloadserenity-b8d6a56fa354a268e3fbfa4fb6d146e9bf60103e.zip
MenuApplets: Move to Userland/MenuApplets/
Diffstat (limited to 'MenuApplets')
-rw-r--r--MenuApplets/Audio/.gitignore1
-rw-r--r--MenuApplets/Audio/CMakeLists.txt6
-rw-r--r--MenuApplets/Audio/main.cpp248
-rw-r--r--MenuApplets/CMakeLists.txt6
-rw-r--r--MenuApplets/ClipboardHistory/CMakeLists.txt7
-rw-r--r--MenuApplets/ClipboardHistory/ClipboardHistoryModel.cpp129
-rw-r--r--MenuApplets/ClipboardHistory/ClipboardHistoryModel.h59
-rw-r--r--MenuApplets/ClipboardHistory/main.cpp106
-rw-r--r--MenuApplets/Clock/.gitignore1
-rw-r--r--MenuApplets/Clock/CMakeLists.txt6
-rw-r--r--MenuApplets/Clock/main.cpp317
-rw-r--r--MenuApplets/Network/CMakeLists.txt6
-rw-r--r--MenuApplets/Network/main.cpp230
-rw-r--r--MenuApplets/ResourceGraph/.gitignore1
-rw-r--r--MenuApplets/ResourceGraph/CMakeLists.txt6
-rw-r--r--MenuApplets/ResourceGraph/main.cpp292
-rw-r--r--MenuApplets/UserName/.gitignore1
-rw-r--r--MenuApplets/UserName/CMakeLists.txt6
-rw-r--r--MenuApplets/UserName/main.cpp101
19 files changed, 0 insertions, 1529 deletions
diff --git a/MenuApplets/Audio/.gitignore b/MenuApplets/Audio/.gitignore
deleted file mode 100644
index ea3d6b372a..0000000000
--- a/MenuApplets/Audio/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-Audio.MenuApplet
diff --git a/MenuApplets/Audio/CMakeLists.txt b/MenuApplets/Audio/CMakeLists.txt
deleted file mode 100644
index f537b4adb0..0000000000
--- a/MenuApplets/Audio/CMakeLists.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-set(SOURCES
- main.cpp
-)
-
-serenity_app(Audio.MenuApplet ICON audio-volume-high)
-target_link_libraries(Audio.MenuApplet LibGUI LibGfx LibAudio)
diff --git a/MenuApplets/Audio/main.cpp b/MenuApplets/Audio/main.cpp
deleted file mode 100644
index ddfa3cb2d3..0000000000
--- a/MenuApplets/Audio/main.cpp
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <LibAudio/ClientConnection.h>
-#include <LibGUI/Application.h>
-#include <LibGUI/BoxLayout.h>
-#include <LibGUI/CheckBox.h>
-#include <LibGUI/Label.h>
-#include <LibGUI/Painter.h>
-#include <LibGUI/Slider.h>
-#include <LibGUI/Widget.h>
-#include <LibGUI/Window.h>
-#include <LibGfx/Bitmap.h>
-#include <LibGfx/Font.h>
-#include <LibGfx/FontDatabase.h>
-#include <LibGfx/Palette.h>
-
-class AudioWidget final : public GUI::Widget {
- C_OBJECT(AudioWidget)
-public:
- AudioWidget()
- : m_audio_client(Audio::ClientConnection::construct())
- {
- m_audio_client->on_muted_state_change = [this](bool muted) {
- if (m_audio_muted == muted)
- return;
- m_mute_box->set_checked(!m_audio_muted);
- m_slider->set_enabled(!muted);
- m_audio_muted = muted;
- update();
- };
-
- m_audio_client->on_main_mix_volume_change = [this](int volume) {
- m_audio_volume = volume;
- if (!m_audio_muted)
- update();
- };
-
- m_volume_level_bitmaps.append({ 66, Gfx::Bitmap::load_from_file("/res/icons/16x16/audio-volume-high.png") });
- m_volume_level_bitmaps.append({ 33, Gfx::Bitmap::load_from_file("/res/icons/16x16/audio-volume-medium.png") });
- m_volume_level_bitmaps.append({ 1, Gfx::Bitmap::load_from_file("/res/icons/16x16/audio-volume-low.png") });
- m_volume_level_bitmaps.append({ 0, Gfx::Bitmap::load_from_file("/res/icons/16x16/audio-volume-zero.png") });
- m_volume_level_bitmaps.append({ 0, Gfx::Bitmap::load_from_file("/res/icons/16x16/audio-volume-muted.png") });
-
- m_slider_window = add<GUI::Window>(window());
- m_slider_window->set_frameless(true);
- m_slider_window->set_resizable(false);
- m_slider_window->set_minimizable(false);
- m_slider_window->on_active_input_change = [this](bool is_active_input) {
- if (!is_active_input)
- close();
- };
-
- m_root_container = m_slider_window->set_main_widget<GUI::Label>();
- m_root_container->set_fill_with_background_color(true);
- m_root_container->set_layout<GUI::VerticalBoxLayout>();
- m_root_container->layout()->set_margins({ 0, 4, 0, 4 });
- m_root_container->layout()->set_spacing(0);
- m_root_container->set_frame_thickness(2);
- m_root_container->set_frame_shape(Gfx::FrameShape::Container);
- m_root_container->set_frame_shadow(Gfx::FrameShadow::Raised);
-
- m_percent_box = m_root_container->add<GUI::CheckBox>("\xE2\x84\xB9");
- m_percent_box->set_fixed_size(27, 16);
- m_percent_box->set_checked(false);
- m_percent_box->set_tooltip("Show percent");
- m_percent_box->on_checked = [&](bool show_percent) {
- m_show_percent = show_percent;
- if (!m_show_percent) {
- window()->resize(16, 16);
- m_percent_box->set_tooltip("Show percent");
- } else {
- window()->resize(44, 16);
- m_percent_box->set_tooltip("Hide percent");
- }
- reposition_slider_window();
- GUI::Application::the()->hide_tooltip();
- };
-
- m_slider = m_root_container->add<GUI::VerticalSlider>();
- m_slider->set_max(20);
- m_slider->set_value(0);
- m_slider->set_knob_size_mode(GUI::Slider::KnobSizeMode::Proportional);
- m_slider->on_change = [&](int value) {
- int volume = clamp((20 - value) * 5, 0, 100);
- float volume_log = ((volume / 100.0f) * (volume / 100.0f)) * 100.0f;
- m_audio_client->set_main_mix_volume(volume_log);
- update();
- };
-
- m_mute_box = m_root_container->add<GUI::CheckBox>("\xE2\x9D\x8C");
- m_mute_box->set_fixed_size(27, 16);
- m_mute_box->set_checked(false);
- m_mute_box->set_tooltip("Mute");
- m_mute_box->on_checked = [&](bool is_muted) {
- m_mute_box->set_tooltip(is_muted ? "Unmute" : "Mute");
- m_audio_client->set_muted(is_muted);
- GUI::Application::the()->hide_tooltip();
- };
- }
-
- virtual ~AudioWidget() override { }
-
-private:
- virtual void mousedown_event(GUI::MouseEvent& event) override
- {
- if (event.button() == GUI::MouseButton::Left) {
- if (!m_slider_window->is_visible())
- open();
- else
- close();
- return;
- }
- if (event.button() == GUI::MouseButton::Right) {
- m_audio_client->set_muted(!m_audio_muted);
- update();
- }
- }
-
- virtual void mousewheel_event(GUI::MouseEvent& event) override
- {
- if (m_audio_muted)
- return;
- int volume = clamp(m_audio_volume - event.wheel_delta() * 5, 0, 100);
- float volume_log = ((volume / 100.0f) * (volume / 100.0f)) * 100.0f;
- m_audio_client->set_main_mix_volume(volume_log);
- m_slider->set_value(20 - (volume / 5));
- update();
- }
-
- virtual void paint_event(GUI::PaintEvent& event) override
- {
- GUI::Painter painter(*this);
- painter.add_clip_rect(event.rect());
- painter.clear_rect(event.rect(), Color::from_rgba(0));
-
- auto& audio_bitmap = choose_bitmap_from_volume();
- painter.blit({}, audio_bitmap, audio_bitmap.rect());
-
- if (m_show_percent) {
- auto volume_text = m_audio_muted ? "mute" : String::format("%d%%", m_audio_volume);
- painter.draw_text({ 16, 3, 24, 16 }, volume_text, Gfx::FontDatabase::default_fixed_width_font(), Gfx::TextAlignment::TopLeft, palette().window_text());
- }
- }
-
- void open()
- {
- reposition_slider_window();
- m_slider_window->show();
- }
-
- void close()
- {
- m_slider_window->hide();
- }
-
- Gfx::Bitmap& choose_bitmap_from_volume()
- {
- if (m_audio_muted)
- return *m_volume_level_bitmaps.last().bitmap;
-
- for (auto& pair : m_volume_level_bitmaps) {
- if (m_audio_volume >= pair.volume_threshold)
- return *pair.bitmap;
- }
- ASSERT_NOT_REACHED();
- }
-
- void reposition_slider_window() { m_slider_window->set_rect(window()->rect_in_menubar().x() - 20, 19, 50, 100); }
-
- struct VolumeBitmapPair {
- int volume_threshold { 0 };
- RefPtr<Gfx::Bitmap> bitmap;
- };
-
- NonnullRefPtr<Audio::ClientConnection> m_audio_client;
- Vector<VolumeBitmapPair, 5> m_volume_level_bitmaps;
- bool m_show_percent { false };
- bool m_audio_muted { false };
- int m_audio_volume { 100 };
-
- RefPtr<GUI::Slider> m_slider;
- RefPtr<GUI::Window> m_slider_window;
- RefPtr<GUI::CheckBox> m_mute_box;
- RefPtr<GUI::CheckBox> m_percent_box;
- RefPtr<GUI::Label> m_root_container;
-};
-
-int main(int argc, char** argv)
-{
- if (pledge("stdio shared_buffer accept rpath unix cpath fattr", nullptr) < 0) {
- perror("pledge");
- return 1;
- }
-
- auto app = GUI::Application::construct(argc, argv);
-
- if (pledge("stdio shared_buffer accept rpath unix", nullptr) < 0) {
- perror("pledge");
- return 1;
- }
-
- auto window = GUI::Window::construct();
- window->set_has_alpha_channel(true);
- window->set_title("Audio");
- window->set_window_type(GUI::WindowType::MenuApplet);
- window->resize(16, 16);
-
- window->set_main_widget<AudioWidget>();
- window->show();
-
- if (unveil("/res", "r") < 0) {
- perror("unveil");
- return 1;
- }
-
- unveil(nullptr, nullptr);
-
- if (pledge("stdio shared_buffer accept rpath", nullptr) < 0) {
- perror("pledge");
- return 1;
- }
-
- return app->exec();
-}
diff --git a/MenuApplets/CMakeLists.txt b/MenuApplets/CMakeLists.txt
deleted file mode 100644
index 08fcccdcc7..0000000000
--- a/MenuApplets/CMakeLists.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-add_subdirectory(Audio)
-add_subdirectory(ClipboardHistory)
-add_subdirectory(Clock)
-add_subdirectory(Network)
-add_subdirectory(ResourceGraph)
-add_subdirectory(UserName)
diff --git a/MenuApplets/ClipboardHistory/CMakeLists.txt b/MenuApplets/ClipboardHistory/CMakeLists.txt
deleted file mode 100644
index 55739a8937..0000000000
--- a/MenuApplets/ClipboardHistory/CMakeLists.txt
+++ /dev/null
@@ -1,7 +0,0 @@
-set(SOURCES
- ClipboardHistoryModel.cpp
- main.cpp
-)
-
-serenity_app(ClipboardHistory.MenuApplet ICON clipboard)
-target_link_libraries(ClipboardHistory.MenuApplet LibGUI LibCore LibGfx)
diff --git a/MenuApplets/ClipboardHistory/ClipboardHistoryModel.cpp b/MenuApplets/ClipboardHistory/ClipboardHistoryModel.cpp
deleted file mode 100644
index 9662c64448..0000000000
--- a/MenuApplets/ClipboardHistory/ClipboardHistoryModel.cpp
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * Copyright (c) 2019-2020, Sergey Bugaev <bugaevc@serenityos.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "ClipboardHistoryModel.h"
-#include <AK/NumberFormat.h>
-#include <AK/StringBuilder.h>
-
-NonnullRefPtr<ClipboardHistoryModel> ClipboardHistoryModel::create()
-{
- return adopt(*new ClipboardHistoryModel());
-}
-
-ClipboardHistoryModel::~ClipboardHistoryModel()
-{
-}
-
-String ClipboardHistoryModel::column_name(int column) const
-{
- switch (column) {
- case Column::Data:
- return "Data";
- case Column::Type:
- return "Type";
- case Column::Size:
- return "Size";
- default:
- ASSERT_NOT_REACHED();
- }
-}
-
-static const char* bpp_for_format_resilient(String format)
-{
- unsigned format_uint = format.to_uint().value_or(static_cast<unsigned>(Gfx::BitmapFormat::Invalid));
- // Cannot use Gfx::Bitmap::bpp_for_format here, as we have to accept invalid enum values.
- switch (static_cast<Gfx::BitmapFormat>(format_uint)) {
- case Gfx::BitmapFormat::Indexed1:
- return "1";
- case Gfx::BitmapFormat::Indexed2:
- return "2";
- case Gfx::BitmapFormat::Indexed4:
- return "4";
- case Gfx::BitmapFormat::Indexed8:
- return "8";
- case Gfx::BitmapFormat::RGB32:
- case Gfx::BitmapFormat::RGBA32:
- return "32";
- case Gfx::BitmapFormat::Invalid:
- /* fall-through */
- default:
- return "?";
- }
-}
-
-GUI::Variant ClipboardHistoryModel::data(const GUI::ModelIndex& index, GUI::ModelRole role) const
-{
- if (role != GUI::ModelRole::Display)
- return {};
- auto& data_and_type = m_history_items[index.row()];
- switch (index.column()) {
- case Column::Data:
- if (data_and_type.mime_type.starts_with("text/"))
- return String::copy(data_and_type.data);
- if (data_and_type.mime_type == "image/x-serenityos") {
- StringBuilder builder;
- builder.append("[");
- builder.append(data_and_type.metadata.get("width").value_or("?"));
- builder.append('x');
- builder.append(data_and_type.metadata.get("height").value_or("?"));
- builder.append('x');
- builder.append(bpp_for_format_resilient(data_and_type.metadata.get("height").value_or("0")));
- builder.append(" bitmap");
- builder.append("]");
- return builder.to_string();
- }
- return "<...>";
- case Column::Type:
- return data_and_type.mime_type;
- case Column::Size:
- return AK::human_readable_size(data_and_type.data.size());
- default:
- ASSERT_NOT_REACHED();
- }
-}
-
-void ClipboardHistoryModel::update()
-{
- did_update();
-}
-
-void ClipboardHistoryModel::add_item(const GUI::Clipboard::DataAndType& item)
-{
- m_history_items.remove_first_matching([&](GUI::Clipboard::DataAndType& existing) {
- return existing.data == item.data && existing.mime_type == item.mime_type;
- });
-
- if (m_history_items.size() == m_history_limit)
- m_history_items.take_last();
-
- m_history_items.prepend(item);
- update();
-}
-
-void ClipboardHistoryModel::remove_item(int index)
-{
- m_history_items.remove(index);
-}
diff --git a/MenuApplets/ClipboardHistory/ClipboardHistoryModel.h b/MenuApplets/ClipboardHistory/ClipboardHistoryModel.h
deleted file mode 100644
index 6398f9c4de..0000000000
--- a/MenuApplets/ClipboardHistory/ClipboardHistoryModel.h
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (c) 2019-2020, Sergey Bugaev <bugaevc@serenityos.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#pragma once
-
-#include <AK/Vector.h>
-#include <LibGUI/Clipboard.h>
-#include <LibGUI/Model.h>
-
-class ClipboardHistoryModel final : public GUI::Model {
-public:
- static NonnullRefPtr<ClipboardHistoryModel> create();
-
- enum Column {
- Data,
- Type,
- Size,
- __Count
- };
-
- virtual ~ClipboardHistoryModel() override;
-
- const GUI::Clipboard::DataAndType& item_at(int index) const { return m_history_items[index]; }
- void add_item(const GUI::Clipboard::DataAndType& item);
- void remove_item(int index);
-
-private:
- virtual int row_count(const GUI::ModelIndex&) const override { return m_history_items.size(); }
- virtual String column_name(int) const override;
- virtual int column_count(const GUI::ModelIndex&) const override { return Column::__Count; }
- virtual GUI::Variant data(const GUI::ModelIndex&, GUI::ModelRole) const override;
- virtual void update() override;
-
- Vector<GUI::Clipboard::DataAndType> m_history_items;
- size_t m_history_limit { 20 };
-};
diff --git a/MenuApplets/ClipboardHistory/main.cpp b/MenuApplets/ClipboardHistory/main.cpp
deleted file mode 100644
index 00750cc823..0000000000
--- a/MenuApplets/ClipboardHistory/main.cpp
+++ /dev/null
@@ -1,106 +0,0 @@
-/*
- * Copyright (c) 2019-2020, Sergey Bugaev <bugaevc@serenityos.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include "ClipboardHistoryModel.h"
-#include <LibGUI/Action.h>
-#include <LibGUI/Application.h>
-#include <LibGUI/ImageWidget.h>
-#include <LibGUI/Menu.h>
-#include <LibGUI/TableView.h>
-#include <LibGUI/Window.h>
-#include <stdio.h>
-
-int main(int argc, char* argv[])
-{
- if (pledge("stdio shared_buffer accept rpath unix cpath fattr", nullptr) < 0) {
- perror("pledge");
- return 1;
- }
-
- auto app = GUI::Application::construct(argc, argv);
-
- if (pledge("stdio shared_buffer accept rpath", nullptr) < 0) {
- perror("pledge");
- return 1;
- }
-
- if (unveil("/res", "r") < 0) {
- perror("unveil");
- return 1;
- }
-
- if (unveil(nullptr, nullptr) < 0) {
- perror("unveil");
- return 1;
- }
-
- auto app_icon = GUI::Icon::default_icon("clipboard");
-
- auto main_window = GUI::Window::construct();
- main_window->set_title("Clipboard history");
- main_window->set_rect(670, 65, 325, 500);
- main_window->set_icon(app_icon.bitmap_for_size(16));
-
- auto& table_view = main_window->set_main_widget<GUI::TableView>();
- auto model = ClipboardHistoryModel::create();
- table_view.set_model(model);
-
- GUI::Clipboard::the().on_change = [&](const String&) {
- auto item = GUI::Clipboard::the().data_and_type();
- model->add_item(item);
- };
-
- table_view.on_activation = [&](const GUI::ModelIndex& index) {
- auto& data_and_type = model->item_at(index.row());
- GUI::Clipboard::the().set_data(data_and_type.data, data_and_type.mime_type, data_and_type.metadata);
- };
-
- auto delete_action = GUI::CommonActions::make_delete_action([&](const GUI::Action&) {
- model->remove_item(table_view.selection().first().row());
- });
-
- auto entry_context_menu = GUI::Menu::construct();
- entry_context_menu->add_action(delete_action);
- table_view.on_context_menu_request = [&](const GUI::ModelIndex&, const GUI::ContextMenuEvent& event) {
- delete_action->set_enabled(!table_view.selection().is_empty());
- entry_context_menu->popup(event.screen_position());
- };
-
- auto applet_window = GUI::Window::construct();
- applet_window->set_title("ClipboardHistory");
- applet_window->set_window_type(GUI::WindowType::MenuApplet);
- auto& icon = applet_window->set_main_widget<GUI::ImageWidget>();
- icon.load_from_file("/res/icons/16x16/clipboard.png");
- icon.set_fill_with_background_color(true);
- icon.on_click = [&main_window = *main_window] {
- main_window.show();
- main_window.move_to_front();
- };
- applet_window->resize(16, 16);
- applet_window->show();
-
- return app->exec();
-}
diff --git a/MenuApplets/Clock/.gitignore b/MenuApplets/Clock/.gitignore
deleted file mode 100644
index 6713bbccb6..0000000000
--- a/MenuApplets/Clock/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-Clock.MenuApplet
diff --git a/MenuApplets/Clock/CMakeLists.txt b/MenuApplets/Clock/CMakeLists.txt
deleted file mode 100644
index ee75b7f455..0000000000
--- a/MenuApplets/Clock/CMakeLists.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-set(SOURCES
- main.cpp
-)
-
-serenity_bin(Clock.MenuApplet)
-target_link_libraries(Clock.MenuApplet LibGUI LibCore LibGfx)
diff --git a/MenuApplets/Clock/main.cpp b/MenuApplets/Clock/main.cpp
deleted file mode 100644
index 153127b3be..0000000000
--- a/MenuApplets/Clock/main.cpp
+++ /dev/null
@@ -1,317 +0,0 @@
-/*
- * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <LibCore/DateTime.h>
-#include <LibCore/Timer.h>
-#include <LibGUI/Application.h>
-#include <LibGUI/BoxLayout.h>
-#include <LibGUI/Button.h>
-#include <LibGUI/Calendar.h>
-#include <LibGUI/Frame.h>
-#include <LibGUI/Label.h>
-#include <LibGUI/Painter.h>
-#include <LibGUI/Widget.h>
-#include <LibGUI/Window.h>
-#include <LibGfx/Font.h>
-#include <LibGfx/FontDatabase.h>
-#include <LibGfx/Palette.h>
-#include <serenity.h>
-#include <spawn.h>
-#include <stdio.h>
-#include <time.h>
-
-class ClockWidget final : public GUI::Widget {
- C_OBJECT(ClockWidget)
-public:
- ClockWidget()
- {
- m_time_width = Gfx::FontDatabase::default_bold_font().width("2222-22-22 22:22:22");
-
- m_timer = add<Core::Timer>(1000, [this] {
- static time_t last_update_time;
- time_t now = time(nullptr);
- if (now != last_update_time) {
- tick_clock();
- last_update_time = now;
- }
- });
-
- m_calendar_window = add<GUI::Window>(window());
- m_calendar_window->set_frameless(true);
- m_calendar_window->set_resizable(false);
- m_calendar_window->set_minimizable(false);
- m_calendar_window->on_active_input_change = [this](bool is_active_input) {
- if (!is_active_input)
- close();
- };
-
- auto& root_container = m_calendar_window->set_main_widget<GUI::Label>();
- root_container.set_fill_with_background_color(true);
- root_container.set_layout<GUI::VerticalBoxLayout>();
- root_container.layout()->set_margins({ 0, 2, 0, 2 });
- root_container.layout()->set_spacing(0);
- root_container.set_frame_thickness(2);
- root_container.set_frame_shape(Gfx::FrameShape::Container);
- root_container.set_frame_shadow(Gfx::FrameShadow::Raised);
-
- auto& navigation_container = root_container.add<GUI::Widget>();
- navigation_container.set_fixed_height(24);
- navigation_container.set_layout<GUI::HorizontalBoxLayout>();
- navigation_container.layout()->set_margins({ 2, 2, 3, 2 });
-
- m_prev_date = navigation_container.add<GUI::Button>();
- m_prev_date->set_button_style(Gfx::ButtonStyle::CoolBar);
- m_prev_date->set_fixed_size(24, 24);
- m_prev_date->set_icon(Gfx::Bitmap::load_from_file("/res/icons/16x16/go-back.png"));
- m_prev_date->on_click = [&](auto) {
- unsigned int target_month = m_calendar->selected_month();
- unsigned int target_year = m_calendar->selected_year();
-
- if (m_calendar->mode() == GUI::Calendar::Month) {
- target_month--;
- if (m_calendar->selected_month() <= 1) {
- target_month = 12;
- target_year--;
- }
- } else {
- target_year--;
- }
-
- m_calendar->update_tiles(target_year, target_month);
- m_selected_calendar_button->set_text(m_calendar->selected_calendar_text(GUI::Calendar::LongNames));
- };
-
- m_selected_calendar_button = navigation_container.add<GUI::Button>();
- m_selected_calendar_button->set_button_style(Gfx::ButtonStyle::CoolBar);
- m_selected_calendar_button->set_fixed_height(24);
- m_selected_calendar_button->on_click = [&](auto) {
- m_calendar->toggle_mode();
- m_selected_calendar_button->set_text(m_calendar->selected_calendar_text(GUI::Calendar::LongNames));
- };
-
- m_next_date = navigation_container.add<GUI::Button>();
- m_next_date->set_button_style(Gfx::ButtonStyle::CoolBar);
- m_next_date->set_fixed_size(24, 24);
- m_next_date->set_icon(Gfx::Bitmap::load_from_file("/res/icons/16x16/go-forward.png"));
- m_next_date->on_click = [&](auto) {
- unsigned int target_month = m_calendar->selected_month();
- unsigned int target_year = m_calendar->selected_year();
-
- if (m_calendar->mode() == GUI::Calendar::Month) {
- target_month++;
- if (m_calendar->selected_month() >= 12) {
- target_month = 1;
- target_year++;
- }
- } else {
- target_year++;
- }
-
- m_calendar->update_tiles(target_year, target_month);
- m_selected_calendar_button->set_text(m_calendar->selected_calendar_text(GUI::Calendar::LongNames));
- };
-
- auto& divider1_container = root_container.add<GUI::Widget>();
- divider1_container.set_fixed_height(2);
- divider1_container.set_layout<GUI::HorizontalBoxLayout>();
- divider1_container.layout()->set_margins({ 2, 0, 3, 0 });
-
- auto& divider1 = divider1_container.add<GUI::Frame>();
- divider1.set_fixed_height(2);
- divider1.set_frame_shape(Gfx::FrameShape::Panel);
-
- auto& calendar_frame_container = root_container.add<GUI::Widget>();
- calendar_frame_container.set_layout<GUI::HorizontalBoxLayout>();
- calendar_frame_container.layout()->set_margins({ 4, 4, 5, 4 });
-
- auto& calendar_frame = calendar_frame_container.add<GUI::Frame>();
- calendar_frame.set_layout<GUI::VerticalBoxLayout>();
- calendar_frame.layout()->set_margins({ 2, 2, 2, 2 });
-
- m_calendar = calendar_frame.add<GUI::Calendar>(Core::DateTime::now());
- m_selected_calendar_button->set_text(m_calendar->selected_calendar_text(GUI::Calendar::LongNames));
-
- m_calendar->on_calendar_tile_click = [&] {
- m_selected_calendar_button->set_text(m_calendar->selected_calendar_text(GUI::Calendar::LongNames));
- };
-
- m_calendar->on_month_tile_click = [&] {
- m_selected_calendar_button->set_text(m_calendar->selected_calendar_text(GUI::Calendar::LongNames));
- };
-
- auto& divider2_container = root_container.add<GUI::Widget>();
- divider2_container.set_fixed_height(2);
- divider2_container.set_layout<GUI::HorizontalBoxLayout>();
- divider2_container.layout()->set_margins({ 2, 0, 3, 0 });
-
- auto& divider2 = divider2_container.add<GUI::Frame>();
- divider2.set_fixed_height(2);
- divider2.set_frame_shape(Gfx::FrameShape::Panel);
-
- auto& settings_container = root_container.add<GUI::Widget>();
- settings_container.set_fixed_height(24);
- settings_container.set_layout<GUI::HorizontalBoxLayout>();
- settings_container.layout()->set_margins({ 2, 2, 3, 2 });
- settings_container.layout()->add_spacer();
-
- m_jump_to_button = settings_container.add<GUI::Button>();
- m_jump_to_button->set_button_style(Gfx::ButtonStyle::CoolBar);
- m_jump_to_button->set_fixed_size(24, 24);
- m_jump_to_button->set_icon(Gfx::Bitmap::load_from_file("/res/icons/16x16/calendar-date.png"));
- m_jump_to_button->set_tooltip("Jump to today");
- m_jump_to_button->on_click = [this](auto) {
- jump_to_current_date();
- };
-
- m_calendar_launcher = settings_container.add<GUI::Button>();
- m_calendar_launcher->set_button_style(Gfx::ButtonStyle::CoolBar);
- m_calendar_launcher->set_fixed_size(24, 24);
- m_calendar_launcher->set_icon(Gfx::Bitmap::load_from_file("/res/icons/16x16/app-calendar.png"));
- m_calendar_launcher->set_tooltip("Calendar");
- m_calendar_launcher->on_click = [](auto) {
- pid_t pid;
- const char* argv[] = { "Calendar", nullptr };
- if ((errno = posix_spawn(&pid, "/bin/Calendar", nullptr, nullptr, const_cast<char**>(argv), environ))) {
- perror("posix_spawn");
- } else {
- if (disown(pid) < 0)
- perror("disown");
- }
- };
- }
-
- virtual ~ClockWidget() override { }
-
- int get_width()
- {
- return m_time_width + menubar_menu_margin();
- }
-
-private:
- static int menubar_menu_margin() { return 2; }
-
- virtual void paint_event(GUI::PaintEvent& event) override
- {
- auto time_text = Core::DateTime::now().to_string();
- GUI::Painter painter(*this);
- painter.fill_rect(event.rect(), palette().window());
- painter.draw_text(event.rect(), time_text, Gfx::FontDatabase::default_font(), Gfx::TextAlignment::Center, palette().window_text());
- }
-
- virtual void mousedown_event(GUI::MouseEvent& event) override
- {
- if (event.button() != GUI::MouseButton::Left) {
- return;
- } else {
- if (!m_calendar_window->is_visible())
- open();
- else
- close();
- }
- }
-
- void tick_clock()
- {
- update();
- }
-
- void open()
- {
- position_calendar_window();
- jump_to_current_date();
- m_calendar_window->show();
- }
-
- void close()
- {
- m_calendar_window->hide();
- }
-
- void position_calendar_window()
- {
- m_calendar_window->set_rect(
- window()->rect_in_menubar().x() - ((m_calendar_window->rect().width() - window()->rect().width()) / 2),
- 19,
- 153,
- 180);
- }
-
- void jump_to_current_date()
- {
- if (m_calendar->mode() == GUI::Calendar::Year)
- m_calendar->toggle_mode();
- m_calendar->set_selected_date(Core::DateTime::now());
- m_calendar->update_tiles(Core::DateTime::now().year(), Core::DateTime::now().month());
- m_selected_calendar_button->set_text(m_calendar->selected_calendar_text(GUI::Calendar::LongNames));
- }
-
- RefPtr<GUI::Window> m_calendar_window;
- RefPtr<GUI::Calendar> m_calendar;
- RefPtr<GUI::Button> m_next_date;
- RefPtr<GUI::Button> m_prev_date;
- RefPtr<GUI::Button> m_selected_calendar_button;
- RefPtr<GUI::Button> m_jump_to_button;
- RefPtr<GUI::Button> m_calendar_launcher;
- RefPtr<Core::Timer> m_timer;
- int m_time_width;
-};
-
-int main(int argc, char** argv)
-{
- if (pledge("stdio shared_buffer accept rpath unix cpath fattr exec proc", nullptr) < 0) {
- perror("pledge");
- return 1;
- }
-
- auto app = GUI::Application::construct(argc, argv);
-
- if (pledge("stdio shared_buffer accept rpath exec proc", nullptr) < 0) {
- perror("pledge");
- return 1;
- }
-
- auto window = GUI::Window::construct();
- window->set_title("Clock");
- window->set_window_type(GUI::WindowType::MenuApplet);
-
- auto& widget = window->set_main_widget<ClockWidget>();
- window->resize(widget.get_width(), 16);
- window->show();
-
- if (unveil("/res", "r") < 0) {
- perror("unveil");
- return 1;
- }
-
- if (unveil("/bin/Calendar", "x") < 0) {
- perror("unveil");
- return 1;
- }
-
- unveil(nullptr, nullptr);
-
- return app->exec();
-}
diff --git a/MenuApplets/Network/CMakeLists.txt b/MenuApplets/Network/CMakeLists.txt
deleted file mode 100644
index be006bdfd1..0000000000
--- a/MenuApplets/Network/CMakeLists.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-set(SOURCES
- main.cpp
-)
-
-serenity_app(Network.MenuApplet ICON network)
-target_link_libraries(Network.MenuApplet LibGUI LibCore LibGfx)
diff --git a/MenuApplets/Network/main.cpp b/MenuApplets/Network/main.cpp
deleted file mode 100644
index 79724eab8b..0000000000
--- a/MenuApplets/Network/main.cpp
+++ /dev/null
@@ -1,230 +0,0 @@
-/*
- * Copyright (c) 2020, the SerenityOS developers.
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <LibCore/ArgsParser.h>
-#include <LibCore/File.h>
-#include <LibGUI/Action.h>
-#include <LibGUI/Application.h>
-#include <LibGUI/ImageWidget.h>
-#include <LibGUI/Menu.h>
-#include <LibGUI/Notification.h>
-#include <LibGUI/Window.h>
-#include <LibGfx/Bitmap.h>
-#include <serenity.h>
-#include <spawn.h>
-#include <stdio.h>
-
-class NetworkWidget final : public GUI::ImageWidget {
- C_OBJECT(NetworkWidget);
-
-public:
- NetworkWidget(bool notifications)
- {
- m_notifications = notifications;
- update_widget();
- start_timer(5000);
- }
-
-private:
- virtual void timer_event(Core::TimerEvent&) override
- {
- update_widget();
- }
-
- virtual void mousedown_event(GUI::MouseEvent& event) override
- {
- if (event.button() != GUI::MouseButton::Left)
- return;
-
- pid_t child_pid;
- const char* argv[] = { "SystemMonitor", "-t", "network", nullptr };
-
- if ((errno = posix_spawn(&child_pid, "/bin/SystemMonitor", nullptr, nullptr, const_cast<char**>(argv), environ))) {
- perror("posix_spawn");
- return;
- }
-
- if (disown(child_pid) < 0)
- perror("disown");
- }
-
- virtual void update_widget()
- {
- auto adapter_info = get_adapter_info();
-
- if (adapter_info == "") {
- set_connected(false);
- m_adapter_info = "No network adapters";
- } else {
- m_adapter_info = adapter_info;
- }
-
- set_tooltip(m_adapter_info);
-
- if (m_connected)
- NetworkWidget::set_bitmap(m_connected_icon);
- else
- NetworkWidget::set_bitmap(m_disconnected_icon);
-
- update();
- }
-
- virtual void notify_on_connect()
- {
- if (!m_notifications)
- return;
- auto notification = GUI::Notification::construct();
- notification->set_title("Network");
- notification->set_icon(m_connected_icon);
- notification->set_text("Network connected");
- notification->show();
- }
-
- virtual void notify_on_disconnect()
- {
- if (!m_notifications)
- return;
- auto notification = GUI::Notification::construct();
- notification->set_title("Network");
- notification->set_icon(m_disconnected_icon);
- notification->set_text("Network disconnected");
- notification->show();
- }
-
- virtual void set_connected(bool connected)
- {
- if (m_connected != connected) {
- connected ? notify_on_connect() : notify_on_disconnect();
- }
-
- m_connected = connected;
- }
-
- virtual String get_adapter_info(bool include_loopback = false)
- {
- StringBuilder adapter_info;
-
- auto file = Core::File::construct("/proc/net/adapters");
- if (!file->open(Core::IODevice::ReadOnly)) {
- fprintf(stderr, "Error: %s\n", file->error_string());
- return adapter_info.to_string();
- }
-
- auto file_contents = file->read_all();
- auto json = JsonValue::from_string(file_contents);
-
- if (!json.has_value())
- return adapter_info.to_string();
-
- int connected_adapters = 0;
- json.value().as_array().for_each([&adapter_info, include_loopback, &connected_adapters](auto& value) {
- auto if_object = value.as_object();
- auto ip_address = if_object.get("ipv4_address").to_string();
- auto ifname = if_object.get("name").to_string();
-
- if (!include_loopback)
- if (ifname == "loop0")
- return;
- if (ip_address != "null")
- connected_adapters++;
-
- adapter_info.appendf("%s: %s\n", ifname.characters(), ip_address.characters());
- });
-
- // show connected icon so long as at least one adapter is connected
- connected_adapters ? set_connected(true) : set_connected(false);
-
- return adapter_info.to_string();
- }
-
- String m_adapter_info;
- bool m_connected = false;
- bool m_notifications = true;
- RefPtr<Gfx::Bitmap> m_connected_icon = Gfx::Bitmap::load_from_file("/res/icons/16x16/network.png");
- RefPtr<Gfx::Bitmap> m_disconnected_icon = Gfx::Bitmap::load_from_file("/res/icons/16x16/network-disconnected.png");
-};
-
-int main(int argc, char* argv[])
-{
- if (pledge("stdio shared_buffer accept rpath unix cpath fattr unix proc exec", nullptr) < 0) {
- perror("pledge");
- return 1;
- }
-
- auto app = GUI::Application::construct(argc, argv);
-
- if (pledge("stdio shared_buffer accept rpath unix proc exec", nullptr) < 0) {
- perror("pledge");
- return 1;
- }
-
- if (unveil("/res", "r") < 0) {
- perror("unveil");
- return 1;
- }
-
- if (unveil("/tmp/portal/notify", "rw") < 0) {
- perror("unveil");
- return 1;
- }
-
- if (unveil("/proc/net/adapters", "r") < 0) {
- perror("unveil");
- return 1;
- }
-
- if (unveil("/bin/SystemMonitor", "x") < 0) {
- perror("unveil");
- return 1;
- }
-
- if (unveil(nullptr, nullptr) < 0) {
- perror("unveil");
- return 1;
- }
-
- bool display_notifications = false;
- const char* name = nullptr;
- Core::ArgsParser args_parser;
- args_parser.add_option(display_notifications, "Display notifications", "display-notifications", 'd');
- args_parser.add_option(name, "Applet name used by WindowServer.ini to set the applet order", "name", 'n', "name");
- args_parser.parse(argc, argv);
-
- if (name == nullptr)
- name = "Network";
-
- auto window = GUI::Window::construct();
- window->set_title(name);
- window->set_window_type(GUI::WindowType::MenuApplet);
- window->resize(16, 16);
- auto& icon = window->set_main_widget<NetworkWidget>(display_notifications);
- icon.set_fill_with_background_color(true);
- icon.load_from_file("/res/icons/16x16/network.png");
- window->resize(16, 16);
- window->show();
-
- return app->exec();
-}
diff --git a/MenuApplets/ResourceGraph/.gitignore b/MenuApplets/ResourceGraph/.gitignore
deleted file mode 100644
index e36878d059..0000000000
--- a/MenuApplets/ResourceGraph/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-ResourceGraph.MenuApplet
diff --git a/MenuApplets/ResourceGraph/CMakeLists.txt b/MenuApplets/ResourceGraph/CMakeLists.txt
deleted file mode 100644
index eea7190853..0000000000
--- a/MenuApplets/ResourceGraph/CMakeLists.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-set(SOURCES
- main.cpp
-)
-
-serenity_bin(ResourceGraph.MenuApplet)
-target_link_libraries(ResourceGraph.MenuApplet LibGUI LibCore LibGfx)
diff --git a/MenuApplets/ResourceGraph/main.cpp b/MenuApplets/ResourceGraph/main.cpp
deleted file mode 100644
index 6ca8157ffa..0000000000
--- a/MenuApplets/ResourceGraph/main.cpp
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * Copyright (c) 2018-2020, Andreas Kling <kling@serenityos.org>
- * Copyright (c) 2020, Linus Groh <mail@linusgroh.de>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <AK/ByteBuffer.h>
-#include <AK/CircularQueue.h>
-#include <AK/JsonObject.h>
-#include <LibCore/ArgsParser.h>
-#include <LibCore/File.h>
-#include <LibCore/ProcessStatisticsReader.h>
-#include <LibGUI/Application.h>
-#include <LibGUI/Frame.h>
-#include <LibGUI/Painter.h>
-#include <LibGUI/Window.h>
-#include <LibGfx/Palette.h>
-#include <serenity.h>
-#include <spawn.h>
-#include <stdio.h>
-
-enum class GraphType {
- CPU,
- Memory,
-};
-
-class GraphWidget final : public GUI::Frame {
- C_OBJECT(GraphWidget);
-
-public:
- static constexpr size_t history_size = 30;
-
- GraphWidget(GraphType graph_type, Optional<Gfx::Color> graph_color, Optional<Gfx::Color> graph_error_color)
- : m_graph_type(graph_type)
- {
- set_frame_thickness(1);
- m_graph_color = graph_color.value_or(palette().menu_selection());
- m_graph_error_color = graph_error_color.value_or(Color::Red);
- start_timer(1000);
- }
-
-private:
- virtual void timer_event(Core::TimerEvent&) override
- {
- switch (m_graph_type) {
- case GraphType::CPU: {
- unsigned busy;
- unsigned idle;
- if (get_cpu_usage(busy, idle)) {
- unsigned busy_diff = busy - m_last_cpu_busy;
- unsigned idle_diff = idle - m_last_cpu_idle;
- m_last_cpu_busy = busy;
- m_last_cpu_idle = idle;
- float cpu = (float)busy_diff / (float)(busy_diff + idle_diff);
- m_history.enqueue(cpu);
- m_tooltip = String::format("CPU usage: %.1f%%", 100 * cpu);
- } else {
- m_history.enqueue(-1);
- m_tooltip = StringView("Unable to determine CPU usage");
- }
- break;
- }
- case GraphType::Memory: {
- u64 allocated, available;
- if (get_memory_usage(allocated, available)) {
- double total_memory = allocated + available;
- double memory = (double)allocated / total_memory;
- m_history.enqueue(memory);
- m_tooltip = String::format("Memory: %.1f MiB of %.1f MiB in use", (float)(allocated / MiB), (float)(total_memory / MiB));
- } else {
- m_history.enqueue(-1);
- m_tooltip = StringView("Unable to determine memory usage");
- }
- break;
- }
- default:
- ASSERT_NOT_REACHED();
- }
- set_tooltip(m_tooltip);
- update();
- }
-
- virtual void paint_event(GUI::PaintEvent& event) override
- {
- GUI::Frame::paint_event(event);
- GUI::Painter painter(*this);
- painter.add_clip_rect(event.rect());
- painter.add_clip_rect(frame_inner_rect());
- painter.fill_rect(event.rect(), Color::Black);
- int i = m_history.capacity() - m_history.size();
- auto rect = frame_inner_rect();
- for (auto value : m_history) {
- if (value >= 0) {
- painter.draw_line(
- { rect.x() + i, rect.bottom() },
- { rect.x() + i, rect.top() + (int)(round(rect.height() - (value * rect.height()))) },
- m_graph_color);
- } else {
- painter.draw_line(
- { rect.x() + i, rect.top() },
- { rect.x() + i, rect.bottom() },
- m_graph_error_color);
- }
- ++i;
- }
- }
-
- virtual void mousedown_event(GUI::MouseEvent& event) override
- {
- if (event.button() != GUI::MouseButton::Left)
- return;
- pid_t child_pid;
- const char* argv[] = { "SystemMonitor", "-t", "graphs", nullptr };
- if ((errno = posix_spawn(&child_pid, "/bin/SystemMonitor", nullptr, nullptr, const_cast<char**>(argv), environ))) {
- perror("posix_spawn");
- } else {
- if (disown(child_pid) < 0)
- perror("disown");
- }
- }
-
- bool get_cpu_usage(unsigned& busy, unsigned& idle)
- {
- busy = 0;
- idle = 0;
-
- auto all_processes = Core::ProcessStatisticsReader::get_all(m_proc_all);
- if (!all_processes.has_value() || all_processes.value().is_empty())
- return false;
-
- for (auto& it : all_processes.value()) {
- for (auto& jt : it.value.threads) {
- if (it.value.pid == 0)
- idle += jt.ticks_user + jt.ticks_kernel;
- else
- busy += jt.ticks_user + jt.ticks_kernel;
- }
- }
- return true;
- }
-
- bool get_memory_usage(u64& allocated, u64& available)
- {
- if (m_proc_mem) {
- // Seeking to the beginning causes a data refresh!
- if (!m_proc_mem->seek(0, Core::File::SeekMode::SetPosition))
- return false;
- } else {
- auto proc_memstat = Core::File::construct("/proc/memstat");
- if (!proc_memstat->open(Core::IODevice::OpenMode::ReadOnly))
- return false;
- m_proc_mem = move(proc_memstat);
- }
-
- auto file_contents = m_proc_mem->read_all();
- auto json = JsonValue::from_string(file_contents);
- ASSERT(json.has_value());
- auto& obj = json.value().as_object();
- unsigned kmalloc_allocated = obj.get("kmalloc_allocated").to_u32();
- unsigned kmalloc_available = obj.get("kmalloc_available").to_u32();
- unsigned user_physical_allocated = obj.get("user_physical_allocated").to_u32();
- unsigned user_physical_committed = obj.get("user_physical_committed").to_u32();
- unsigned user_physical_uncommitted = obj.get("user_physical_uncommitted").to_u32();
- unsigned kmalloc_bytes_total = kmalloc_allocated + kmalloc_available;
- unsigned kmalloc_pages_total = (kmalloc_bytes_total + PAGE_SIZE - 1) / PAGE_SIZE;
- unsigned total_userphysical_and_swappable_pages = kmalloc_pages_total + user_physical_allocated + user_physical_committed + user_physical_uncommitted;
- allocated = kmalloc_allocated + ((u64)(user_physical_allocated + user_physical_committed) * PAGE_SIZE);
- available = (u64)(total_userphysical_and_swappable_pages * PAGE_SIZE) - allocated;
- return true;
- }
-
- GraphType m_graph_type;
- Gfx::Color m_graph_color;
- Gfx::Color m_graph_error_color;
- CircularQueue<float, history_size> m_history;
- unsigned m_last_cpu_busy { 0 };
- unsigned m_last_cpu_idle { 0 };
- String m_tooltip;
- RefPtr<Core::File> m_proc_all;
- RefPtr<Core::File> m_proc_mem;
-};
-
-int main(int argc, char** argv)
-{
- if (pledge("stdio shared_buffer accept proc exec rpath unix cpath fattr", nullptr) < 0) {
- perror("pledge");
- return 1;
- }
-
- auto app = GUI::Application::construct(argc, argv);
-
- if (pledge("stdio shared_buffer accept proc exec rpath", nullptr) < 0) {
- perror("pledge");
- return 1;
- }
-
- bool cpu = false;
- bool memory = false;
- const char* name = nullptr;
- const char* color = nullptr;
- const char* error_color = nullptr;
- Core::ArgsParser args_parser;
- args_parser.add_option(cpu, "Show CPU usage", "cpu", 'C');
- args_parser.add_option(memory, "Show memory usage", "memory", 'M');
- args_parser.add_option(name, "Applet name used by WindowServer.ini to set the applet order", "name", 'n', "name");
- args_parser.add_option(color, "Graph color", "color", 'c', "color");
- args_parser.add_option(error_color, "Graph color (error)", "error-color", 'e', "error-color");
- args_parser.parse(argc, argv);
-
- if (!cpu && !memory) {
- printf("Either --cpu or --memory option must be used");
- return 1;
- }
- if (cpu && memory) {
- printf("--cpu and --memory options must not be used together");
- return 1;
- }
- GraphType graph_type;
- if (cpu)
- graph_type = GraphType::CPU;
- if (memory)
- graph_type = GraphType::Memory;
-
- if (name == nullptr)
- name = "ResourceGraph";
-
- Optional<Gfx::Color> graph_color, graph_error_color;
- if (color != nullptr)
- graph_color = Gfx::Color::from_string(color);
- if (error_color != nullptr)
- graph_error_color = Gfx::Color::from_string(error_color);
-
- auto window = GUI::Window::construct();
- window->set_title(name);
- window->set_window_type(GUI::WindowType::MenuApplet);
- window->resize(GraphWidget::history_size + 2, 16);
-
- window->set_main_widget<GraphWidget>(graph_type, graph_color, graph_error_color);
- window->show();
-
- if (unveil("/res", "r") < 0) {
- perror("unveil");
- return 1;
- }
-
- // FIXME: This is required by Core::ProcessStatisticsReader.
- // It would be good if we didn't depend on that.
- if (unveil("/etc/passwd", "r") < 0) {
- perror("unveil");
- return 1;
- }
-
- if (unveil("/proc/all", "r") < 0) {
- perror("unveil");
- return 1;
- }
-
- if (unveil("/proc/memstat", "r") < 0) {
- perror("unveil");
- return 1;
- }
-
- if (unveil("/bin/SystemMonitor", "x") < 0) {
- perror("unveil");
- return 1;
- }
-
- unveil(nullptr, nullptr);
-
- return app->exec();
-}
diff --git a/MenuApplets/UserName/.gitignore b/MenuApplets/UserName/.gitignore
deleted file mode 100644
index 7aeb4e8be7..0000000000
--- a/MenuApplets/UserName/.gitignore
+++ /dev/null
@@ -1 +0,0 @@
-UserName.MenuApplet
diff --git a/MenuApplets/UserName/CMakeLists.txt b/MenuApplets/UserName/CMakeLists.txt
deleted file mode 100644
index 1c4f1ee11a..0000000000
--- a/MenuApplets/UserName/CMakeLists.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-set(SOURCES
- main.cpp
-)
-
-serenity_bin(UserName.MenuApplet)
-target_link_libraries(UserName.MenuApplet LibGUI LibGfx)
diff --git a/MenuApplets/UserName/main.cpp b/MenuApplets/UserName/main.cpp
deleted file mode 100644
index df4e133463..0000000000
--- a/MenuApplets/UserName/main.cpp
+++ /dev/null
@@ -1,101 +0,0 @@
-/*
- * Copyright (c) 2020, Hüseyin Aslıtürk <asliturk@hotmail.com>
- * All rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice, this
- * list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- *
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
- * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
- * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
- * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
- * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
- * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
- * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
- * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- */
-
-#include <LibGUI/Application.h>
-#include <LibGUI/Painter.h>
-#include <LibGUI/Widget.h>
-#include <LibGUI/Window.h>
-#include <LibGfx/Font.h>
-#include <LibGfx/FontDatabase.h>
-#include <LibGfx/Palette.h>
-#include <stdio.h>
-
-class UserNameWidget final : public GUI::Widget {
- C_OBJECT(UserNameWidget)
-public:
- UserNameWidget()
- {
- m_username = getlogin();
- m_username_width = Gfx::FontDatabase::default_bold_font().width(m_username);
- }
-
- virtual ~UserNameWidget() override { }
-
- int get_width()
- {
- return m_username_width + menubar_menu_margin();
- }
-
-private:
- static int menubar_menu_margin() { return 4; }
-
- virtual void paint_event(GUI::PaintEvent& event) override
- {
- GUI::Painter painter(*this);
- painter.fill_rect(event.rect(), palette().window());
- painter.draw_text(event.rect(), m_username, Gfx::FontDatabase::default_bold_font(), Gfx::TextAlignment::Center, palette().window_text());
- }
-
- String m_username;
- int m_username_width;
-};
-
-int main(int argc, char** argv)
-{
- if (pledge("stdio shared_buffer rpath cpath unix fattr", nullptr) < 0) {
- perror("pledge");
- return 1;
- }
-
- auto app = GUI::Application::construct(argc, argv);
-
- if (pledge("stdio shared_buffer rpath", nullptr) < 0) {
- perror("pledge");
- return 1;
- }
-
- if (unveil("/res", "r") < 0) {
- perror("unveil");
- return 1;
- }
-
- if (unveil("/etc/passwd", "r") < 0) {
- perror("unveil");
- return 1;
- }
-
- unveil(nullptr, nullptr);
-
- auto window = GUI::Window::construct();
- window->set_title("UserName");
- window->set_window_type(GUI::WindowType::MenuApplet);
-
- auto& widget = window->set_main_widget<UserNameWidget>();
- window->resize(widget.get_width(), 16);
- window->show();
-
- return app->exec();
-}