BIN := AxWinWM
OBJ := main.o wm.o input.o video.o ipc.o
OBJ += messageio.o
-OBJ += renderer_classes.o renderer_passthru.o renderer_widget.o
+OBJ += renderer_classes.o renderer_passthru.o renderer_widget.o renderer_background.o
LDFLAGS += -limage_sif -luri -lnet
#define _RENDERER_WIDGET_H_
#include <wm_renderer.h>
+#include <axwin3/widget.h>
enum
{
MSG_WIDGET_SETTEXT
};
-enum eElementTypes
-{
- ELETYPE_NONE,
-
- ELETYPE_WINDOW, //!< Window root element
-
- ELETYPE_BOX, //!< Content box (invisible in itself)
- ELETYPE_TABBAR, //!< Tab Bar
- ELETYPE_TOOLBAR, //!< Tool Bar
-
- ELETYPE_BUTTON, //!< Push Button
-
- ELETYPE_TEXT, //!< Text
- ELETYPE_IMAGE, //!< Image
-
- ELETYPE_SPACER, //!< Visual Spacer (horizontal / vertical rule)
-
- MAX_ELETYPES = 0x100
-};
-
-enum eElementFlags
-{
- /**
- * \brief Rendered
- *
- * If set, the element will be ignored in calculating sizes and
- * rendering.
- */
- ELEFLAG_NORENDER = 0x001,
- /**
- * \brief Element visibility
- *
- * If set, the element is not drawn (but still is used for size calculations)
- */
- ELEFLAG_INVISIBLE = 0x002,
-
- /**
- * \brief Position an element absulutely (ignored in size calcs)
- */
- ELEFLAG_ABSOLUTEPOS = 0x004,
-
- /**
- * \brief Fixed size element
- */
- ELEFLAG_FIXEDSIZE = 0x008,
-
- /**
- * \brief Element "orientation"
- *
- * Vertical means that the children of this element are stacked,
- * otherwise they list horizontally
- */
- ELEFLAG_VERTICAL = 0x010,// ELEFLAG_HORIZONTAL = 0x000,
- /**
- * \brief Action for text that overflows
- */
- ELEFLAG_WRAP = 0x020,// ELEFLAG_NOWRAP = 0x000,
- /**
- * \brief Cross size action
- *
- * If this flag is set, the element will only be as large (across
- * its parent) as is needed to encase the contents of the element.
- * Otherwise, the element will expand to fill all avaliable space.
- */
- ELEFLAG_NOEXPAND = 0x040,
-
- /**
- * \brief With (length) size action
- * If this flag is set, the element will only be as large as
- * is required along it's parent
- */
- ELEFLAG_NOSTRETCH = 0x080,
-
- /**
- * \brief Center alignment
- */
- ELEFLAG_ALIGN_CENTER= 0x100,
- /**
- * \brief Right/Bottom alignment
- *
- * If set, the element aligns to the end of avaliable space (instead
- * of the beginning)
- */
- ELEFLAG_ALIGN_END = 0x200
-};
typedef struct
{
* \brief Window Flags
* \{
*/
+//! Render the window
#define WINFLAG_SHOW 0x00000001
+//! Window contents are valid
+#define WINFLAG_CLEAN 0x00000001
+
#define WINFLAG_RENDER_MASK 0x00FFFF00
#define WINFLAG_USR_MASK 0xFF000000
/**
struct sWindow
{
- tWindow *GlobalNext;
- tWindow *RenderNext;
+ tWindow *NextSibling;
+ tWindow *PrevSibling;
+
+ tWindow *Parent;
tWindow *FirstChild;
tWindow *LastChild;
--- /dev/null
+/*
+ * Acess2 Window Manager v3
+ * - By John Hodge (thePowersGang)
+ *
+ * render_widget.c
+ * - AxWin2 Background port
+ */
+#include <common.h>
+#include <wm_renderer.h>
+
+// === TYPES ===
+
+// === STRUCTURES ===
+struct sBgWin
+{
+ uint32_t Colour;
+};
+
+// === PROTOTYPES ===
+tWindow *Renderer_Background_Create(int Flags);
+void Renderer_Background_Redraw(tWindow *Window);
+int Renderer_Background_HandleMessage(tWindow *Target, int Msg, int Len, void *Data);
+
+// === GLOBALS ===
+tWMRenderer gRenderer_Background = {
+ .Name = "Background",
+ .CreateWindow = Renderer_Background_Create,
+ .Redraw = Renderer_Background_Redraw,
+ .HandleMessage = Renderer_Background_HandleMessage
+};
+
+// === CODE ===
+int Renderer_Background_Init(void)
+{
+ WM_RegisterRenderer(&gRenderer_Background);
+
+ return 0;
+}
+
+tWindow *Renderer_Background_Create(int Arg)
+{
+ tWindow *ret;
+ ret = WM_CreateWindowStruct( sizeof(struct sBgWin) );
+
+ ((struct sBgWin*)ret->RendererInfo)->Colour = Arg;
+
+ return ret;
+}
+
+void Renderer_Background_Redraw(tWindow *Window)
+{
+ struct sBgWin *info = Window->RendererInfo;
+
+ WM_Render_FilledRect(Window, 0, 0, 0xFFFF, 0xFFFF, info->Colour);
+}
+
+int Renderer_Background_HandleMessage(tWindow *Target, int Msg, int Len, void *Data)
+{
+ switch(Msg)
+ {
+ // TODO: Handle resize
+
+ default:
+ break;
+ }
+ return 0;
+}
+
+
+
+
// === GLOBALS ===
tWMRenderer *gpWM_Renderers;
+// - Render order list (gpWM_FirstWindow is rendered first)
+tWindow *gpWM_RootWindow;
// === CODE ===
+void WM_Initialise(void)
+{
+ WM_CreateWindow(NULL, 0x8888FF, "Background");
+}
+
void WM_RegisterRenderer(tWMRenderer *Renderer)
{
// TODO: Catch out duplicates
// - Call create window function
ret = renderer->CreateWindow(RendererArg);
-
+ ret->Parent = Parent;
+
+ if(!Parent)
+ Parent = gpWM_RootWindow;
+
+ // Append to parent
+ if(Parent)
+ {
+ if(Parent->LastChild)
+ Parent->LastChild->NextSibling = ret;
+ else
+ Parent->FirstChild = ret;
+ ret->PrevSibling = Parent->LastChild;
+ Parent->LastChild = ret;
+ }
+ else
+ {
+ gpWM_RootWindow = ret;
+ }
+
// - Return!
return ret;
}
return calloc( sizeof(tWindow) + ExtraSize, 1 );
}
+void WM_int_UpdateWindow(tWindow *Window)
+{
+ tWindow *child;
+
+ // Ignore hidden windows
+ if( !(Window->Flags & WINFLAG_SHOW) )
+ return ;
+ // Ignore unchanged windows
+ if( Window->Flags & WINFLAG_CLEAN )
+ return;
+
+ // Render
+ Window->Renderer->Redraw(Window);
+
+ // Process children
+ for( child = Window->FirstChild; child; child = child->NextSibling )
+ {
+ WM_int_UpdateWindow(child);
+ }
+
+ Window->Flags |= WINFLAG_CLEAN;
+}
+
void WM_Update(void)
{
// - Iterate through visible windows, updating them as needed
#include "include/internal.h"
// === STRUCTURES ===
+struct sAxWin3_Widget
+{
+ tHWND Window;
+ tAxWin3_Widget_Callback Callback;
+};
+
typedef struct
{
+ int nElements;
+ tAxWin3_Widget **Elements;
// Callbacks for each element
} tWidgetWindowInfo;
#define _AXWIN3_AXWIN_H_
typedef struct sAxWin3_Window *tHWND;
+typedef unsigned int tAxWin3_Colour; // TODO: Actual 32-bit
typedef void (*tAxWin3_MessageCallback)(int SourceTID, int Length);
#include "axwin.h"
+typedef struct sAxWin3_Widget tAxWin3_Widget;
+
+typedef int (*tAxWin3_Widget_Callback)(tAxWin3_Widget Widget, int EventType, unsigned long EventArg);
+
extern tHWND AxWin3_Widget_CreateWindow(tHWND Parent, int W, int H, int RootEleFlags);
+extern void AxWin3_Widget_DestroyWindow(tHWND Window);
+extern tAxWin3_Widget *AxWin3_WidgeT_GetRoot(tHWND Window);
+
+extern tAxWin3_Widget *AxWin3_Widget_AddWidget(tAxWin3_Widget *Parent, int Type, int Flags, const char *DebugName);
+extern void AxWin3_Widget_DelWidget(tAxWin3_Widget *Widget);
+
+extern void AxWin3_Widget_SetSize(tAxWin3_Widget *Widget, int Size);
+extern void AxWin3_Widget_SetText(tAxWin3_Widget *Widget, const char *Text);
+extern void AxWin3_Widget_SetColour(tAxWin3_Widget *Widget, int Index, tAxWin3_Colour Colour);
+
+enum eElementTypes
+{
+ ELETYPE_NONE,
+
+ ELETYPE_WINDOW, //!< Window root element
+
+ ELETYPE_BOX, //!< Content box (invisible in itself)
+ ELETYPE_TABBAR, //!< Tab Bar
+ ELETYPE_TOOLBAR, //!< Tool Bar
+
+ ELETYPE_BUTTON, //!< Push Button
+
+ ELETYPE_TEXT, //!< Text
+ ELETYPE_IMAGE, //!< Image
+
+ ELETYPE_SPACER, //!< Visual Spacer (horizontal / vertical rule)
+
+ MAX_ELETYPES = 0x100
+};
+
+enum eElementFlags
+{
+ /**
+ * \brief Rendered
+ *
+ * If set, the element will be ignored in calculating sizes and
+ * rendering.
+ */
+ ELEFLAG_NORENDER = 0x001,
+ /**
+ * \brief Element visibility
+ *
+ * If set, the element is not drawn (but still is used for size calculations)
+ */
+ ELEFLAG_INVISIBLE = 0x002,
+
+ /**
+ * \brief Position an element absulutely (ignored in size calcs)
+ */
+ ELEFLAG_ABSOLUTEPOS = 0x004,
+
+ /**
+ * \brief Fixed size element
+ */
+ ELEFLAG_FIXEDSIZE = 0x008,
+
+ /**
+ * \brief Element "orientation"
+ *
+ * Vertical means that the children of this element are stacked,
+ * otherwise they list horizontally
+ */
+ ELEFLAG_VERTICAL = 0x010,// ELEFLAG_HORIZONTAL = 0x000,
+ /**
+ * \brief Action for text that overflows
+ */
+ ELEFLAG_WRAP = 0x020,// ELEFLAG_NOWRAP = 0x000,
+ /**
+ * \brief Cross size action
+ *
+ * If this flag is set, the element will only be as large (across
+ * its parent) as is needed to encase the contents of the element.
+ * Otherwise, the element will expand to fill all avaliable space.
+ */
+ ELEFLAG_NOEXPAND = 0x040,
+
+ /**
+ * \brief With (length) size action
+ * If this flag is set, the element will only be as large as
+ * is required along it's parent
+ */
+ ELEFLAG_NOSTRETCH = 0x080,
+
+ /**
+ * \brief Center alignment
+ */
+ ELEFLAG_ALIGN_CENTER= 0x100,
+ /**
+ * \brief Right/Bottom alignment
+ *
+ * If set, the element aligns to the end of avaliable space (instead
+ * of the beginning)
+ */
+ ELEFLAG_ALIGN_END = 0x200
+};
+
#endif