From fae1f1d96fc1e923aabc87d11ed0dfcf4d17a36b Mon Sep 17 00:00:00 2001 From: John Hodge Date: Mon, 26 Apr 2010 09:14:12 +0800 Subject: [PATCH] More work on the GUI. Still useless tho --- Usermode/Applications/axwin2_src/WM/Makefile | 2 +- .../Applications/axwin2_src/WM/interface.c | 51 +++++++++++++- Usermode/Applications/axwin2_src/WM/wm.c | 67 +++++++++++++++++++ Usermode/Applications/axwin2_src/WM/wm.h | 54 ++++++++++++++- 4 files changed, 171 insertions(+), 3 deletions(-) create mode 100644 Usermode/Applications/axwin2_src/WM/wm.c diff --git a/Usermode/Applications/axwin2_src/WM/Makefile b/Usermode/Applications/axwin2_src/WM/Makefile index 61206120..cce4a811 100644 --- a/Usermode/Applications/axwin2_src/WM/Makefile +++ b/Usermode/Applications/axwin2_src/WM/Makefile @@ -7,6 +7,6 @@ CPPFLAGS += -I../include DIR := Apps/AxWin/1.0 BIN := ../AxWinWM OBJ := main.o helpers.o commandline.o video.o -OBJ += messages.o interface.o +OBJ += messages.o interface.o wm.o -include ../../Makefile.tpl diff --git a/Usermode/Applications/axwin2_src/WM/interface.c b/Usermode/Applications/axwin2_src/WM/interface.c index 4d22b50f..1eec6b4e 100644 --- a/Usermode/Applications/axwin2_src/WM/interface.c +++ b/Usermode/Applications/axwin2_src/WM/interface.c @@ -6,12 +6,61 @@ // === GLOBALS == int giInterface_Width = 0; +tElement *gpInterface_Sidebar; +tElement *gpInterface_MainArea; +tElement *gpInterface_HeaderBar; +tElement *gpInterface_TabBar; +tElement *gpInterface_TabContent; // === CODE === -void Interface_Render(void) +void Interface_Init(void) { + tElement *btn, *text; + giInterface_Width = giScreenWidth/16; + WM_SetFlags(NULL, ELEFLAG_HORIZONTAL); + + // Create Sidebar + gpInterface_Sidebar = WM_CreateElement(NULL, ELETYPE_TOOLBAR, ELEFLAG_VERTICAL); + WM_SetSize( gpInterface_Sidebar, giInterface_Width ); + // Create Main Area and regions within + gpInterface_MainArea = WM_CreateElement(NULL, ELETYPE_BOX, ELEFLAG_VERTICAL); + gpInterface_HeaderBar = WM_CreateElement(gpInterface_MainArea, ELETYPE_BOX, ELEFLAG_HORIZONTAL); + gpInterface_TabBar = WM_CreateElement(gpInterface_MainArea, ELETYPE_TABBAR, 0); + gpInterface_TabContent = WM_CreateElement(gpInterface_MainArea, ELETYPE_BOX, 0); + + // Menu Button + btn = WM_CreateElement(gpInterface_Sidebar, ELETYPE_BUTTON, 0); + WM_SetSize(btn, giInterface_Width); + //text = WM_CreateElement(btn, ELETYPE_IMAGE, ELEFLAG_SCALE); + //WM_SetText(text, "asset://LogoSmall.png"); + text = WM_CreateElement(btn, ELETYPE_TEXT, 0); + WM_SetText(text, "Acess"); + + // Plain
style spacer + WM_CreateElement(gpInterface_Sidebar, ELETYPE_SPACER, 0); + + // Create spacing gap (aligns the rest to the bottom/right) + WM_CreateElement(gpInterface_Sidebar, ELETYPE_GAP, 0); + + // Plain
style spacer + WM_CreateElement(gpInterface_Sidebar, ELETYPE_SPACER, 0); + + // Version String + text = WM_CreateElement(gpInterface_Sidebar, ELETYPE_TEXT, ELEFLAG_WRAP); + WM_SetText(text, "AxWin 1.0"); +} + +void Interface_Update(void) +{ + giInterface_Width = giScreenWidth/16; + WM_SetSize( gpInterface_Sidebar, giInterface_Width ); +} + +void Interface_Render(void) +{ + Video_FillRect( 0, 0, giInterface_Width, giScreenHeight, diff --git a/Usermode/Applications/axwin2_src/WM/wm.c b/Usermode/Applications/axwin2_src/WM/wm.c new file mode 100644 index 00000000..7763d3bf --- /dev/null +++ b/Usermode/Applications/axwin2_src/WM/wm.c @@ -0,0 +1,67 @@ +/* + * Acess GUI (AxWin) Version 2 + * By John Hodge (thePowersGang) + * + * Window Manager and Widget Control + */ +#include "common.h" +#include +#include +#include "wm.h" + +tElement gWM_RootElement; + +// === PROTOTYPES === +tElement *WM_CreateElement(tElement *Parent, int Type, int Flags); +void WM_SetFlags(tElement *Element, int Flags); +void WM_SetSize(tElement *Element, int Size); +void WM_SetText(tElement *Element, char *Text); + +// === CODE === +tElement *WM_CreateElement(tElement *Parent, int Type, int Flags) +{ + tElement *ret; + + if(Type < 0 || Type >= NUM_ELETYPES) return NULL; + + ret = calloc(sizeof(tElement), 1); + if(!ret) return NULL; + + // Prepare + ret->Type = Type; + ret->Parent = Parent; + + // Append to parent's list + ret->NextSibling = Parent->LastChild; + Parent->LastChild = ret; + if(!Parent->FirstChild) Parent->FirstChild = ret; + + return ret; +} + +void WM_SetFlags(tElement *Element, int Flags) +{ + // Permissions are handled in the message handler + if(!Element) { + gWM_RootElement.Flags = Flags; + return ; + } + + Element->Flags = Flags; + return ; +} + +void WM_SetSize(tElement *Element, int Size) +{ + if(!Element) return ; + Element->Size = Size; + return ; +} + +void WM_SetText(tElement *Element, char *Text) +{ + if(!Element) return ; + if(Element->Text) free(Element->Text); + Element->Text = strdup(Text); + return ; +} diff --git a/Usermode/Applications/axwin2_src/WM/wm.h b/Usermode/Applications/axwin2_src/WM/wm.h index e7b6bee9..38dc1ac5 100644 --- a/Usermode/Applications/axwin2_src/WM/wm.h +++ b/Usermode/Applications/axwin2_src/WM/wm.h @@ -4,18 +4,35 @@ typedef struct sElement { + int Type; + + struct sElement *Parent; + struct sElement *FirstChild; + struct sElement *LastChild; struct sElement *NextSibling; + short CachedX; short CachedY; short CachedW; short CachedH; - struct sElement *FirstChild; + short Size; // Size attribute + + char *Text; + void *Data; + + uint32_t Flags; } tElement; typedef struct sTab { + int Type; // Should be zero, allows a tab to be the parent of an element + + struct sElement *Parent; + struct sElement *FirstChild; + struct sElement *LastChild; + char *Name; tElement *RootElement; @@ -31,4 +48,39 @@ typedef struct sApplication char Name[]; } tApplication; +// === CONSTANTS === +enum eElementFlags +{ + ELEFLAG_VISIBLE = 0x001, ELEFLAG_INVISIBLE = 0x000, + ELEFLAG_VERTICAL = 0x002, ELEFLAG_HORIZONTAL = 0x000, + ELEFLAG_WRAP = 0x004, ELEFLAG_NOWRAP = 0x000, +}; +/** + */ +enum eElementTypes +{ + ELETYPE_NONE, + + ELETYPE_BOX, //!< Content box + ELETYPE_TABBAR, //!< Tab Bar + ELETYPE_TOOLBAR, //!< Tool Bar + + ELETYPE_BUTTON, //!< Push Button + ELETYPE_TEXT, //!< Text + + ELETYPE_SPACER, //!< Visual Spacer + ELETYPE_GAP, //!< Alignment Gap + + NUM_ELETYPES +}; + +// === FUNCTIONS === +/** + * \brief Create a new element as a child of \a Parent + */ +extern tElement *WM_CreateElement(tElement *Parent, int Type, int Flags); +extern void WM_SetFlags(tElement *Element, int Flags); +extern void WM_SetSize(tElement *Element, int Size); +extern void WM_SetText(tElement *Element, char *Text); + #endif -- 2.20.1