summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBrendan Coles <bcoles@gmail.com>2020-04-18 20:55:36 +0000
committerAndreas Kling <kling@serenityos.org>2020-04-19 02:09:50 +0200
commit1c44ae6d19eac4e25258130345c3690aedc1beea (patch)
tree0e2d6ebd89d913b69c23a67d6925c533add8fc53
parent856ab9c600d1aa2a8aae327e2b4172a6c6c77217 (diff)
downloadserenity-1c44ae6d19eac4e25258130345c3690aedc1beea.zip
Demos: Add Screensaver demo
-rw-r--r--Demos/Screensaver/Makefile8
-rw-r--r--Demos/Screensaver/Screensaver.cpp145
-rwxr-xr-xKernel/build-root-filesystem.sh1
3 files changed, 154 insertions, 0 deletions
diff --git a/Demos/Screensaver/Makefile b/Demos/Screensaver/Makefile
new file mode 100644
index 0000000000..3c7424a224
--- /dev/null
+++ b/Demos/Screensaver/Makefile
@@ -0,0 +1,8 @@
+OBJS = \
+ Screensaver.o
+
+PROGRAM = Screensaver
+
+LIB_DEPS = GUI IPC Gfx Core
+
+include ../../Makefile.common
diff --git a/Demos/Screensaver/Screensaver.cpp b/Demos/Screensaver/Screensaver.cpp
new file mode 100644
index 0000000000..e63005f53a
--- /dev/null
+++ b/Demos/Screensaver/Screensaver.cpp
@@ -0,0 +1,145 @@
+/*
+ * 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/ElapsedTimer.h>
+#include <LibGfx/Bitmap.h>
+#include <LibGUI/Application.h>
+#include <LibGUI/Action.h>
+#include <LibGUI/Event.h>
+#include <LibGUI/Painter.h>
+#include <LibGUI/Widget.h>
+#include <LibGUI/Window.h>
+#include <math.h>
+#include <stdio.h>
+
+#define WIDTH 64
+#define HEIGHT 48
+#define INTERVAL 10000
+
+class Screensaver final : public GUI::Widget {
+ C_OBJECT(Screensaver)
+public:
+ virtual ~Screensaver() override;
+
+private:
+ Screensaver();
+ RefPtr<Gfx::Bitmap> m_bitmap;
+
+ virtual void paint_event(GUI::PaintEvent&) override;
+ virtual void timer_event(Core::TimerEvent&) override;
+ virtual void keydown_event(GUI::KeyEvent&) override;
+ virtual void mousedown_event(GUI::MouseEvent& event) override;
+ virtual void mousemove_event(GUI::MouseEvent& event) override;
+};
+
+Screensaver::Screensaver()
+{
+ m_bitmap = Gfx::Bitmap::create(Gfx::BitmapFormat::RGB32, { WIDTH, HEIGHT });
+ stop_timer();
+ start_timer(INTERVAL);
+}
+
+Screensaver::~Screensaver()
+{
+}
+
+void Screensaver::mousemove_event(GUI::MouseEvent&)
+{
+ ::exit(0);
+}
+
+void Screensaver::mousedown_event(GUI::MouseEvent&)
+{
+ ::exit(0);
+}
+void Screensaver::keydown_event(GUI::KeyEvent&)
+{
+ ::exit(0);
+}
+
+void Screensaver::paint_event(GUI::PaintEvent& event)
+{
+ GUI::Painter painter(*this);
+ painter.draw_scaled_bitmap(event.rect(), *m_bitmap, m_bitmap->rect());
+}
+
+void Screensaver::timer_event(Core::TimerEvent&)
+{
+ Core::ElapsedTimer timer;
+ timer.start();
+
+ const Color colors[] {
+ Color::Blue,
+ Color::Cyan,
+ Color::Green,
+ Color::LightGray,
+ Color::Magenta,
+ Color::Red,
+ Color::Yellow,
+ };
+
+ const Orientation orientations[] {
+ Gfx::Orientation::Horizontal,
+ Gfx::Orientation::Vertical
+ };
+
+
+ int start_color_index = 0;
+ int end_color_index = 0;
+ while (start_color_index == end_color_index) {
+ start_color_index = rand() % (sizeof(colors) / sizeof(colors[0]));
+ end_color_index = rand() % (sizeof(colors) / sizeof(colors[0]));
+ }
+
+ GUI::Painter painter(*m_bitmap);
+ painter.fill_rect_with_gradient(
+ orientations[rand() % (sizeof(orientations) / sizeof(orientations[0]))],
+ m_bitmap->rect(),
+ colors[start_color_index],
+ colors[end_color_index]
+ );
+
+ update();
+}
+
+int main(int argc, char** argv)
+{
+ GUI::Application app(argc, argv);
+
+ auto window = GUI::Window::construct();
+ window->set_double_buffering_enabled(true);
+ window->set_title("Screensaver");
+ window->set_resizable(false);
+ window->set_fullscreen(true);
+
+ auto& screensaver_window = window->set_main_widget<Screensaver>();
+ screensaver_window.update();
+
+ window->show();
+ window->set_icon(Gfx::Bitmap::load_from_file("/res/icons/16x16/app-demo.png"));
+
+ return app.exec();
+}
diff --git a/Kernel/build-root-filesystem.sh b/Kernel/build-root-filesystem.sh
index 91abe37d73..f8a77f99c4 100755
--- a/Kernel/build-root-filesystem.sh
+++ b/Kernel/build-root-filesystem.sh
@@ -149,6 +149,7 @@ cp ../Games/Solitaire/Solitaire mnt/bin/Solitaire
cp ../Demos/HelloWorld/HelloWorld mnt/bin/HelloWorld
cp ../Demos/WidgetGallery/WidgetGallery mnt/bin/WidgetGallery
cp ../Demos/Cube/Cube mnt/bin/Cube
+cp ../Demos/Screensaver/Screensaver mnt/bin/Screensaver
cp ../Demos/Fire/Fire mnt/bin/Fire
cp ../Demos/DynamicLink/LinkDemo/LinkDemo mnt/bin/LinkDemo
cp ../DevTools/HackStudio/HackStudio mnt/bin/HackStudio