mirror of
https://github.com/Fennix-Project/Kernel.git
synced 2025-07-16 01:31:45 +00:00
.github
.vscode
Architecture
Core
Execute
FileSystem
Files
GUI
Library
Network
Profiling
Recovery
SystemCalls
Tasking
Tests
include
boot
cpu
filesystem
net
stb
std
sys
abi.h
assert.h
atomic.hpp
bitmap.hpp
cargs.h
convert.h
cpu.hpp
crc32.h
cstring
cwalk.h
debug.h
disk.hpp
display.hpp
dlfcn.h
driver.hpp
dumper.hpp
elf.h
errno.h
exec.hpp
filesystem.hpp
gui.hpp
hashmap.hpp
intrin.hpp
ints.hpp
io.h
ipc.hpp
kconfig.hpp
limits.h
lock.hpp
math.h
md5.h
memory.hpp
msexec.h
pci.hpp
power.hpp
printf.h
pthread.h
rand.hpp
recovery.hpp
sched.h
smart_ptr.hpp
smp.hpp
std.hpp
stddef.h
stdint.h
stdio.h
stdlib.h
string.h
string.hpp
strings.h
symbols.hpp
sys.h
syscalls.hpp
targp.h
task.hpp
time.hpp
types.h
uart.hpp
unistd.h
vector.hpp
wchar.h
.gitignore
DAPI.hpp
Doxyfile
Fex.hpp
KConfig.cpp
KThread.cpp
Kernel.cpp
LICENSE
Makefile
README.md
dump.sh
ipc.h
kernel.h
syscalls.h
392 lines
11 KiB
C++
392 lines
11 KiB
C++
#ifndef __FENNIX_KERNEL_GUI_H__
|
|
#define __FENNIX_KERNEL_GUI_H__
|
|
|
|
#include <types.h>
|
|
#include <display.hpp>
|
|
#include <memory.hpp>
|
|
#include <vector.hpp>
|
|
#include <debug.h>
|
|
|
|
namespace GraphicalUserInterface
|
|
{
|
|
typedef uintptr_t Handle;
|
|
|
|
struct MouseData
|
|
{
|
|
int64_t X;
|
|
int64_t Y;
|
|
int64_t Z;
|
|
bool Left;
|
|
bool Right;
|
|
bool Middle;
|
|
};
|
|
|
|
struct ScreenBitmap
|
|
{
|
|
int64_t Width;
|
|
int64_t Height;
|
|
uint64_t Size;
|
|
uint64_t Pitch;
|
|
uint64_t BitsPerPixel;
|
|
uint8_t *Data;
|
|
};
|
|
|
|
struct Rect
|
|
{
|
|
int64_t Left;
|
|
int64_t Top;
|
|
int64_t Width;
|
|
int64_t Height;
|
|
|
|
bool Contains(int64_t X, int64_t Y)
|
|
{
|
|
return (X >= Left && X <= Left + Width && Y >= Top && Y <= Top + Height);
|
|
}
|
|
|
|
bool Contains(Rect rect)
|
|
{
|
|
return (rect.Left >= Left && rect.Left + rect.Width <= Left + Width && rect.Top >= Top && rect.Top + rect.Height <= Top + Height);
|
|
}
|
|
};
|
|
|
|
enum CursorType
|
|
{
|
|
Visible = 0,
|
|
Hidden,
|
|
Arrow,
|
|
Hand,
|
|
Wait,
|
|
IBeam,
|
|
ResizeHorizontal,
|
|
ResizeVertical,
|
|
ResizeDiagonalLeft,
|
|
ResizeDiagonalRight,
|
|
ResizeAll,
|
|
Cross,
|
|
Help,
|
|
No,
|
|
AppStarting,
|
|
};
|
|
|
|
struct Event
|
|
{
|
|
struct
|
|
{
|
|
int64_t Width;
|
|
int64_t Height;
|
|
} Resize;
|
|
|
|
struct
|
|
{
|
|
int64_t X;
|
|
int64_t Y;
|
|
bool Left;
|
|
bool Right;
|
|
bool Middle;
|
|
} MouseDown;
|
|
|
|
struct
|
|
{
|
|
int64_t X;
|
|
int64_t Y;
|
|
bool Left;
|
|
bool Right;
|
|
bool Middle;
|
|
} MouseUp;
|
|
|
|
struct
|
|
{
|
|
int64_t X;
|
|
int64_t Y;
|
|
bool Left;
|
|
bool Right;
|
|
bool Middle;
|
|
} MouseMove;
|
|
};
|
|
|
|
/*
|
|
virtual void OnMouseMove(Event *e) {}
|
|
virtual void OnMouseClick(Event *e) {}
|
|
virtual void OnMouseDoubleClick(Event *e) {}
|
|
virtual void OnMouseDown(Event *e) {}
|
|
virtual void OnMouseUp(Event *e) {}
|
|
virtual void OnMouseWheel(Event *e) {}
|
|
virtual void OnMouseEnter(Event *e) {}
|
|
virtual void OnMouseLeave(Event *e) {}
|
|
virtual void OnMouseHover(Event *e) {}
|
|
virtual void OnMouseDrag(Event *e) {}
|
|
virtual void OnMouseDragStart(Event *e) {}
|
|
virtual void OnMouseDragEnd(Event *e) {}
|
|
virtual void OnMouseDragEnter(Event *e) {}
|
|
virtual void OnMouseDragLeave(Event *e) {}
|
|
virtual void OnMouseDragHover(Event *e) {}
|
|
virtual void OnMouseDragDrop(Event *e) {}
|
|
virtual void OnMouseDragDropEnter(Event *e) {}
|
|
virtual void OnMouseDragDropLeave(Event *e) {}
|
|
virtual void OnMouseDragDropHover(Event *e) {}
|
|
virtual void OnMouseDragDropEnd(Event *e) {}
|
|
virtual void OnMouseDragDropStart(Event *e) {}
|
|
virtual void OnMouseDragDropCancel(Event *e) {}
|
|
virtual void OnMouseDragDropComplete(Event *e) {}
|
|
virtual void OnMouseDragDropAbort(Event *e) {}
|
|
|
|
virtual void OnKeyDown(Event *e) {}
|
|
virtual void OnKeyUp(Event *e) {}
|
|
virtual void OnKeyPress(Event *e) {}
|
|
|
|
virtual void OnFocusEnter(Event *e) {}
|
|
virtual void OnFocusLeave(Event *e) {}
|
|
virtual void OnFocusHover(Event *e) {}
|
|
|
|
virtual void OnResize(Event *e) {}
|
|
virtual void OnMinimize(Event *e) {}
|
|
virtual void OnMaximize(Event *e) {}
|
|
virtual void OnMove(Event *e) {}
|
|
virtual void OnShow(Event *e) {}
|
|
virtual void OnHide(Event *e) {}
|
|
virtual void OnClose(Event *e) {}
|
|
virtual void OnDestroy(Event *e) {}
|
|
|
|
virtual void OnPaint(Event *e) {}
|
|
virtual void OnPaintBackground(Event *e) {}
|
|
virtual void OnPaintForeground(Event *e) {}
|
|
virtual void OnPaintOverlay(Event *e) {}
|
|
virtual void OnPaintAll(Event *e) {}
|
|
virtual void OnPaintChildren(Event *e) {}
|
|
virtual void OnPaintChildrenBackground(Event *e) {}
|
|
virtual void OnPaintChildrenForeground(Event *e) {}
|
|
virtual void OnPaintChildrenBorder(Event *e) {}
|
|
virtual void OnPaintChildrenShadow(Event *e) {}
|
|
virtual void OnPaintChildrenOverlay(Event *e) {}
|
|
virtual void OnPaintChildrenAll(Event *e) {}
|
|
*/
|
|
|
|
void SetPixel(ScreenBitmap *Bitmap, long X, long Y, uint32_t Color);
|
|
void DrawOverBitmap(ScreenBitmap *DestinationBitmap,
|
|
ScreenBitmap *SourceBitmap,
|
|
long Top,
|
|
long Left,
|
|
bool IgnoreZero = true);
|
|
void PutRect(ScreenBitmap *Bitmap, Rect rect, uint32_t Color);
|
|
void PutBorder(ScreenBitmap *Bitmap, Rect rect, uint32_t Color);
|
|
uint32_t BlendColors(uint32_t c1, uint32_t c2, float t);
|
|
void PutBorderWithShadow(ScreenBitmap *Bitmap, Rect rect, uint32_t Color);
|
|
void DrawShadow(ScreenBitmap *Bitmap, Rect rect);
|
|
void PaintChar(Video::Font *font, ScreenBitmap *Bitmap, char c, uint32_t Color, long *CharCursorX, long *CharCursorY);
|
|
void DrawString(ScreenBitmap *Bitmap, Rect rect, const char *Text, uint32_t Color);
|
|
|
|
class WidgetCollection
|
|
{
|
|
private:
|
|
Memory::MemMgr *mem;
|
|
ScreenBitmap *Buffer;
|
|
Video::Font *CurrentFont;
|
|
void *ParentWindow;
|
|
bool NeedRedraw;
|
|
|
|
struct HandleMeta
|
|
{
|
|
char Type[4];
|
|
};
|
|
|
|
struct LabelObject
|
|
{
|
|
HandleMeta Handle;
|
|
Rect rect;
|
|
char Text[512];
|
|
uint32_t Color;
|
|
long CharCursorX, CharCursorY;
|
|
};
|
|
|
|
struct PanelObject
|
|
{
|
|
HandleMeta Handle;
|
|
Rect rect;
|
|
uint32_t Color;
|
|
uint32_t BorderColor;
|
|
uint32_t ShadowColor;
|
|
bool Shadow;
|
|
};
|
|
|
|
struct ButtonObject
|
|
{
|
|
HandleMeta Handle;
|
|
Rect rect;
|
|
char Text[512];
|
|
uint32_t Color;
|
|
uint32_t HoverColor;
|
|
uint32_t PressedColor;
|
|
uint32_t BorderColor;
|
|
uint32_t ShadowColor;
|
|
long CharCursorX, CharCursorY;
|
|
bool Shadow;
|
|
bool Hover;
|
|
bool Pressed;
|
|
uintptr_t OnClick;
|
|
};
|
|
|
|
std::vector<LabelObject *> Labels;
|
|
std::vector<PanelObject *> Panels;
|
|
std::vector<ButtonObject *> Buttons;
|
|
|
|
public:
|
|
void ReplaceFont(Video::Font *NewFont)
|
|
{
|
|
delete this->CurrentFont;
|
|
this->CurrentFont = NewFont;
|
|
}
|
|
|
|
Handle CreatePanel(Rect rect, uint32_t Color);
|
|
Handle CreateButton(Rect rect, const char *Text, uintptr_t OnClick = (uintptr_t) nullptr);
|
|
Handle CreateLabel(Rect rect, const char *Text);
|
|
Handle CreateTextBox(Rect rect, const char *Text);
|
|
Handle CreateCheckBox(Rect rect, const char *Text);
|
|
Handle CreateRadioButton(Rect rect, const char *Text);
|
|
Handle CreateComboBox(Rect rect, const char *Text);
|
|
Handle CreateListBox(Rect rect, const char *Text);
|
|
Handle CreateProgressBar(Rect rect, const char *Text);
|
|
Handle CreateContextMenu(Rect rect, const char *Text);
|
|
|
|
void SetText(Handle handle, const char *Text);
|
|
|
|
WidgetCollection(void /* Window */ *ParentWindow);
|
|
~WidgetCollection();
|
|
|
|
void OnMouseMove(Event *e);
|
|
void OnMouseClick(Event *e);
|
|
void OnMouseDoubleClick(Event *e);
|
|
void OnMouseDown(Event *e);
|
|
void OnMouseUp(Event *e);
|
|
void OnMouseWheel(Event *e);
|
|
void OnMouseEnter(Event *e);
|
|
void OnMouseLeave(Event *e);
|
|
void OnMouseHover(Event *e);
|
|
void OnMouseDrag(Event *e);
|
|
void OnMouseDragStart(Event *e);
|
|
void OnMouseDragEnd(Event *e);
|
|
|
|
void OnKeyDown(Event *e);
|
|
void OnKeyUp(Event *e);
|
|
void OnKeyPress(Event *e);
|
|
|
|
void OnShow(Event *e);
|
|
void OnHide(Event *e);
|
|
void OnDestroy(Event *e);
|
|
|
|
void OnPaint(Event *e);
|
|
void OnPaintBackground(Event *e);
|
|
void OnPaintForeground(Event *e);
|
|
};
|
|
|
|
class Window
|
|
{
|
|
private:
|
|
Memory::MemMgr *mem;
|
|
ScreenBitmap *Buffer;
|
|
Rect Position;
|
|
Rect LastPosition;
|
|
char Title[256];
|
|
std::vector<WidgetCollection *> Widgets;
|
|
void *ParentGUI;
|
|
|
|
bool Maximized;
|
|
bool Minimized;
|
|
|
|
public:
|
|
bool IsMaximized() { return Maximized; }
|
|
bool IsMinimized() { return Minimized; }
|
|
ScreenBitmap *GetBuffer() { return Buffer; }
|
|
Rect GetPosition() { return Position; }
|
|
Rect *GetPositionPtr() { return &Position; }
|
|
const char *GetTitle() { return (const char *)Title; }
|
|
void SetTitle(const char *Title) { strcpy(this->Title, Title); }
|
|
void AddWidget(WidgetCollection *widget);
|
|
|
|
Window(void *ParentGUI, Rect rect, const char *Title);
|
|
~Window();
|
|
|
|
void OnMouseMove(Event *e);
|
|
void OnMouseClick(Event *e);
|
|
void OnMouseDoubleClick(Event *e);
|
|
void OnMouseDown(Event *e);
|
|
void OnMouseUp(Event *e);
|
|
void OnMouseWheel(Event *e);
|
|
void OnMouseEnter(Event *e);
|
|
void OnMouseLeave(Event *e);
|
|
void OnMouseHover(Event *e);
|
|
void OnMouseDrag(Event *e);
|
|
void OnMouseDragStart(Event *e);
|
|
void OnMouseDragEnd(Event *e);
|
|
|
|
void OnKeyDown(Event *e);
|
|
void OnKeyUp(Event *e);
|
|
void OnKeyPress(Event *e);
|
|
|
|
void OnFocusEnter(Event *e);
|
|
void OnFocusLeave(Event *e);
|
|
void OnFocusHover(Event *e);
|
|
|
|
void OnResize(Event *e);
|
|
void OnMinimize(Event *e);
|
|
void OnMaximize(Event *e);
|
|
void OnMove(Event *e);
|
|
void OnShow(Event *e);
|
|
void OnHide(Event *e);
|
|
void OnClose(Event *e);
|
|
void OnDestroy(Event *e);
|
|
|
|
void OnPaint(Event *e);
|
|
void OnPaintBackground(Event *e);
|
|
void OnPaintForeground(Event *e);
|
|
void OnPaintOverlay(Event *e);
|
|
void OnPaintAll(Event *e);
|
|
void OnPaintChildren(Event *e);
|
|
void OnPaintChildrenBackground(Event *e);
|
|
void OnPaintChildrenForeground(Event *e);
|
|
void OnPaintChildrenBorder(Event *e);
|
|
void OnPaintChildrenShadow(Event *e);
|
|
void OnPaintChildrenOverlay(Event *e);
|
|
void OnPaintChildrenAll(Event *e);
|
|
};
|
|
|
|
class GUI
|
|
{
|
|
private:
|
|
MouseData MouseArray[256];
|
|
Memory::MemMgr *mem;
|
|
Video::Font *CurrentFont;
|
|
Rect Desktop;
|
|
ScreenBitmap *BackBuffer;
|
|
ScreenBitmap *DesktopBuffer;
|
|
ScreenBitmap *OverlayBuffer;
|
|
ScreenBitmap *CursorBuffer;
|
|
std::vector<WidgetCollection *> Widgets;
|
|
std::vector<Window *> Windows;
|
|
CursorType Cursor = CursorType::Arrow;
|
|
CursorType LastCursor = CursorType::Arrow;
|
|
bool CursorVisible = true;
|
|
bool IsRunning = false;
|
|
|
|
bool DesktopBufferRepaint = true;
|
|
bool OverlayBufferRepaint = true;
|
|
bool OverlayFullRepaint = true;
|
|
bool CursorBufferRepaint = true;
|
|
|
|
void FetchInputs();
|
|
void PaintDesktop();
|
|
void PaintWidgets();
|
|
void PaintWindows();
|
|
void PaintCursor();
|
|
|
|
public:
|
|
void SetCursorType(CursorType Type = CursorType::Visible) { this->Cursor = Type; }
|
|
void Loop();
|
|
void AddWindow(Window *window);
|
|
void AddWidget(WidgetCollection *widget);
|
|
GUI();
|
|
~GUI();
|
|
};
|
|
}
|
|
|
|
#endif // !__FENNIX_KERNEL_GUI_H__
|