summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Kling <awesomekling@gmail.com>2019-02-12 15:23:07 +0100
committerAndreas Kling <awesomekling@gmail.com>2019-02-12 15:23:07 +0100
commitd74b131c272a433d328a2863af8ef57f43fd8a56 (patch)
tree247dd08361ba28d15aa7e98ffe6c4e1b259dca4b
parentd6326d6c2ec6a2849f3f0ad0e16c1df3ac0fc326 (diff)
downloadserenity-d74b131c272a433d328a2863af8ef57f43fd8a56.zip
Add a little About app and hook it up to the system menu's "About..." entry.
Added icons and customizable text alignment to GLabel.
-rw-r--r--Applications/About/.gitignore3
-rw-r--r--Applications/About/Makefile34
-rw-r--r--Applications/About/main.cpp47
-rw-r--r--Applications/FontEditor/FontEditor.cpp1
-rw-r--r--Base/res/icons/Serenity.rgbbin0 -> 4096 bytes
-rwxr-xr-xKernel/makeall.sh2
-rwxr-xr-xKernel/sync.sh1
-rw-r--r--LibGUI/GLabel.cpp14
-rw-r--r--LibGUI/GLabel.h12
-rw-r--r--LibGUI/GStatusBar.cpp1
-rw-r--r--WindowServer/WSWindowManager.cpp5
11 files changed, 118 insertions, 2 deletions
diff --git a/Applications/About/.gitignore b/Applications/About/.gitignore
new file mode 100644
index 0000000000..17f634a6a2
--- /dev/null
+++ b/Applications/About/.gitignore
@@ -0,0 +1,3 @@
+*.o
+*.d
+About
diff --git a/Applications/About/Makefile b/Applications/About/Makefile
new file mode 100644
index 0000000000..3b84f7c2e7
--- /dev/null
+++ b/Applications/About/Makefile
@@ -0,0 +1,34 @@
+OBJS = \
+ main.o
+
+APP = About
+
+ARCH_FLAGS =
+STANDARD_FLAGS = -std=c++17 -nostdinc++ -nostdlib -nostdinc
+USERLAND_FLAGS = -ffreestanding -fno-stack-protector -fno-ident
+WARNING_FLAGS = -Wextra -Wall -Wundef -Wcast-qual -Wwrite-strings
+FLAVOR_FLAGS = -march=i386 -m32 -fno-exceptions -fno-rtti -fmerge-all-constants -fno-unroll-loops -fno-pie -fno-pic
+OPTIMIZATION_FLAGS = -Oz -fno-asynchronous-unwind-tables
+INCLUDE_FLAGS = -I../.. -I. -I../../LibC
+
+DEFINES = -DSERENITY -DSANITIZE_PTRS -DUSERLAND
+
+CXXFLAGS = -MMD -MP $(WARNING_FLAGS) $(OPTIMIZATION_FLAGS) $(USERLAND_FLAGS) $(FLAVOR_FLAGS) $(ARCH_FLAGS) $(STANDARD_FLAGS) $(INCLUDE_FLAGS) $(DEFINES)
+CXX = clang
+LD = ld
+AR = ar
+LDFLAGS = -static --strip-debug -melf_i386 -e _start --gc-sections
+
+all: $(APP)
+
+$(APP): $(OBJS)
+ $(LD) -o $(APP) $(LDFLAGS) $(OBJS) ../../LibGUI/LibGUI.a ../../LibC/LibC.a
+
+.cpp.o:
+ @echo "CXX $<"; $(CXX) $(CXXFLAGS) -o $@ -c $<
+
+-include $(OBJS:%.o=%.d)
+
+clean:
+ @echo "CLEAN"; rm -f $(APPS) $(OBJS) *.d
+
diff --git a/Applications/About/main.cpp b/Applications/About/main.cpp
new file mode 100644
index 0000000000..ead9a03808
--- /dev/null
+++ b/Applications/About/main.cpp
@@ -0,0 +1,47 @@
+#include <LibGUI/GApplication.h>
+#include <LibGUI/GWindow.h>
+#include <LibGUI/GLabel.h>
+#include <LibGUI/GButton.h>
+#include <sys/utsname.h>
+
+int main(int argc, char** argv)
+{
+ GApplication app(argc, argv);
+
+ auto* window = new GWindow;
+ window->set_title("About Serenity");
+ window->set_rect(362, 284, 240, 130);
+ window->set_should_exit_app_on_close(true);
+
+ auto* widget = new GWidget;
+ window->set_main_widget(widget);
+
+ auto* icon_label = new GLabel(widget);
+ icon_label->set_icon(GraphicsBitmap::load_from_file("/res/icons/Serenity.rgb", { 32, 32 }));
+ icon_label->set_relative_rect(
+ widget->rect().center().x() - 16,
+ 10,
+ 32, 32);
+
+ auto* label = new GLabel(widget);
+ label->set_text("Serenity Operating System");
+ label->set_relative_rect(0, 50, widget->width(), 20);
+
+ utsname uts;
+ int rc = uname(&uts);
+ ASSERT(rc == 0);
+
+ auto* version_label = new GLabel(widget);
+ version_label->set_text(String::format("Version %s", uts.release));
+ version_label->set_relative_rect(0, 70, widget->width(), 20);
+
+ auto* quit_button = new GButton(widget);
+ quit_button->set_caption("Okay");
+ quit_button->set_relative_rect(80, 100, widget->width() - 160, 20);
+ quit_button->on_click = [] (GButton&) {
+ GApplication::the().exit(0);
+ };
+
+ window->show();
+ return app.exec();
+}
diff --git a/Applications/FontEditor/FontEditor.cpp b/Applications/FontEditor/FontEditor.cpp
index 6d2e0c346e..1fd1431762 100644
--- a/Applications/FontEditor/FontEditor.cpp
+++ b/Applications/FontEditor/FontEditor.cpp
@@ -42,6 +42,7 @@ FontEditorWidget::FontEditorWidget(const String& path, RetainPtr<Font>&& edited_
};
auto* info_label = new GLabel(this);
+ info_label->set_text_alignment(TextAlignment::CenterLeft);
info_label->set_relative_rect({ 5, 110, 100, 20 });
auto* demo_label_1 = new GLabel(this);
diff --git a/Base/res/icons/Serenity.rgb b/Base/res/icons/Serenity.rgb
new file mode 100644
index 0000000000..7cdfbbaca2
--- /dev/null
+++ b/Base/res/icons/Serenity.rgb
Binary files differ
diff --git a/Kernel/makeall.sh b/Kernel/makeall.sh
index 5e3a145c75..e119d66d9f 100755
--- a/Kernel/makeall.sh
+++ b/Kernel/makeall.sh
@@ -18,6 +18,8 @@ make -C ../Applications/Launcher clean && \
make -C ../Applications/Launcher && \
make -C ../Applications/FileManager clean && \
make -C ../Applications/FileManager && \
+make -C ../Applications/About clean && \
+make -C ../Applications/About && \
make clean &&\
make && \
sudo ./sync.sh
diff --git a/Kernel/sync.sh b/Kernel/sync.sh
index 0f46f2ef5d..c4b8fef6c1 100755
--- a/Kernel/sync.sh
+++ b/Kernel/sync.sh
@@ -69,6 +69,7 @@ cp -v ../Applications/FontEditor/FontEditor mnt/bin/FontEditor
cp -v ../Applications/Launcher/Launcher mnt/bin/Launcher
cp -v ../Applications/Clock/Clock mnt/bin/Clock
cp -v ../Applications/FileManager/FileManager mnt/bin/FileManager
+cp -v ../Applications/About/About mnt/bin/About
cp -v kernel.map mnt/
sh sync-local.sh
umount mnt
diff --git a/LibGUI/GLabel.cpp b/LibGUI/GLabel.cpp
index dde70f1fc4..ef9813a07a 100644
--- a/LibGUI/GLabel.cpp
+++ b/LibGUI/GLabel.cpp
@@ -1,5 +1,6 @@
#include "GLabel.h"
#include <SharedGraphics/Painter.h>
+#include <SharedGraphics/GraphicsBitmap.h>
GLabel::GLabel(GWidget* parent)
: GWidget(parent)
@@ -10,6 +11,11 @@ GLabel::~GLabel()
{
}
+void GLabel::set_icon(RetainPtr<GraphicsBitmap>&& icon)
+{
+ m_icon = move(icon);
+}
+
void GLabel::set_text(String&& text)
{
if (text == m_text)
@@ -18,11 +24,15 @@ void GLabel::set_text(String&& text)
update();
}
-void GLabel::paint_event(GPaintEvent& event)
+void GLabel::paint_event(GPaintEvent&)
{
Painter painter(*this);
if (fill_with_background_color())
painter.fill_rect({ 0, 0, width(), height() }, background_color());
+ if (m_icon) {
+ auto icon_location = rect().center().translated(-(m_icon->width() / 2), -(m_icon->height() / 2));
+ painter.blit_with_alpha(icon_location, *m_icon, m_icon->rect());
+ }
if (!text().is_empty())
- painter.draw_text({ 4, 4, width(), height() }, text(), TextAlignment::TopLeft, foreground_color());
+ painter.draw_text({ 0, 0, width(), height() }, text(), m_text_alignment, foreground_color());
}
diff --git a/LibGUI/GLabel.h b/LibGUI/GLabel.h
index 4e1446ffee..f84a5dc3b5 100644
--- a/LibGUI/GLabel.h
+++ b/LibGUI/GLabel.h
@@ -2,6 +2,9 @@
#include "GWidget.h"
#include <AK/AKString.h>
+#include <SharedGraphics/Painter.h>
+
+class GraphicsBitmap;
class GLabel final : public GWidget {
public:
@@ -11,11 +14,20 @@ public:
String text() const { return m_text; }
void set_text(String&&);
+ void set_icon(RetainPtr<GraphicsBitmap>&&);
+ const GraphicsBitmap* icon() const { return m_icon.ptr(); }
+ GraphicsBitmap* icon() { return m_icon.ptr(); }
+
+ TextAlignment text_alignment() const { return m_text_alignment; }
+ void set_text_alignment(TextAlignment text_alignment) { m_text_alignment = text_alignment; }
+
private:
virtual void paint_event(GPaintEvent&) override;
virtual const char* class_name() const override { return "GLabel"; }
String m_text;
+ RetainPtr<GraphicsBitmap> m_icon;
+ TextAlignment m_text_alignment { TextAlignment::Center };
};
diff --git a/LibGUI/GStatusBar.cpp b/LibGUI/GStatusBar.cpp
index a8b7232428..77e38090be 100644
--- a/LibGUI/GStatusBar.cpp
+++ b/LibGUI/GStatusBar.cpp
@@ -10,6 +10,7 @@ GStatusBar::GStatusBar(GWidget* parent)
set_preferred_size({ 0, 16 });
set_layout(make<GBoxLayout>(Orientation::Horizontal));
m_label = new GLabel(this);
+ m_label->set_text_alignment(TextAlignment::CenterLeft);
m_label->set_fill_with_background_color(false);
}
diff --git a/WindowServer/WSWindowManager.cpp b/WindowServer/WSWindowManager.cpp
index 1fb86b8657..6d2f6744f0 100644
--- a/WindowServer/WSWindowManager.cpp
+++ b/WindowServer/WSWindowManager.cpp
@@ -198,6 +198,11 @@ WSWindowManager::WSWindowManager()
Process::create_user_process("/bin/Terminal", 100, 100, current->pid(), error);
return;
}
+ if (item.identifier() == 4) {
+ int error;
+ Process::create_user_process("/bin/About", 100, 100, current->pid(), error);
+ return;
+ }
kprintf("WSMenu 1 item activated: '%s'\n", item.text().characters());
};
}