#include <stdlib.h>
#include <string.h>
#include "wm.h"
+#include <acess/sys.h> // _SysDebug
// === IMPORTS ===
extern void Decorator_RenderWidget(tElement *Element);
extern void Video_GetTextDims(tFont *Font, const char *Text, int *W, int *H);
// === PROTOTYPES ===
-tElement *WM_CreateElement(tElement *Parent, int Type, int Flags, const char *DebugName);
+tElement *AxWin_CreateElement(tElement *Parent, int Type, int Flags, const char *DebugName);
+void AxWin_DeleteElement(tElement *Element);
+void AxWin_SetFlags(tElement *Element, int Flags);
+void AxWin_SetSize(tElement *Element, int Size);
+void AxWin_SetText(tElement *Element, const char *Text);
void WM_UpdateMinDims(tElement *Element);
-void WM_SetFlags(tElement *Element, int Flags);
-void WM_SetSize(tElement *Element, int Size);
-void WM_SetText(tElement *Element, char *Text);
void WM_UpdateDimensions(tElement *Element, int Pass);
void WM_UpdatePosition(tElement *Element);
void WM_RenderWidget(tElement *Element);
void WM_Update(void);
// === GLOBALS ===
+// - TODO: Handle windows by having multiple root elements
tElement gWM_RootElement = {
- DebugName: "ROOT"
+ .DebugName = "ROOT"
};
+
+tApplication *gWM_Applications;
+
+// --- Element type flags
struct {
void (*Init)(tElement *This);
+ void (*Delete)(tElement *This);
void (*UpdateFlags)(tElement *This);
void (*UpdateSize)(tElement *This);
void (*UpdateText)(tElement *This);
{NULL, NULL, NULL, NULL}, // NULL
{NULL, NULL, NULL, NULL} // Box
};
+const int ciWM_NumWidgetTypes = sizeof(gaWM_WidgetTypes)/sizeof(gaWM_WidgetTypes[0]);
// === CODE ===
+tApplication *AxWin_RegisterClient(int IdentLen, void *Ident, tMessages_Handle_Callback *Cb, const char *Name)
+{
+ tApplication *ret = calloc( 1, sizeof(tApplication) + 1 + strlen(Name) + 1 + IdentLen );
+
+ ret->Name = &ret->MetaElement.DebugName[1];
+ strcpy(ret->Name, Name);
+ ret->Ident = ret->Name + strlen(Name) + 1;
+ memcpy(ret->Ident, Ident, IdentLen);
+ ret->SendMessage = Cb;
+
+ ret->Next = gWM_Applications;
+ gWM_Applications = ret;
+
+ // TODO: Inform listeners of the new application
+
+ return ret;
+}
+
+void AxWin_DeregisterClient(tApplication *App)
+{
+ tElement *win, *next;
+ // TODO: Implement DeregisterClient
+
+ for( win = App->MetaElement.FirstChild; win; win = next )
+ {
+ next = win->NextSibling;
+ AxWin_DeleteElement(win);
+ }
+
+ // TODO: Inform listeners of deleted application
+ // TODO: Remove from list
+ free(App);
+}
+
+tElement *AxWin_CreateWindow(tApplication *App, const char *Name)
+{
+ tElement *ret;
+
+ // TODO: Implement _CreateTab
+
+ ret = AxWin_CreateElement(&App->MetaElement, ELETYPE_WINDOW, 0, NULL);
+ ret->Text = strdup(Name);
+ return ret;
+}
+
// --- Widget Creation and Control ---
-tElement *WM_CreateElement(tElement *Parent, int Type, int Flags, const char *DebugName)
+tAxWin_Element *AxWin_CreateElement(tElement *Parent, int Type, int Flags, const char *DebugName)
{
tElement *ret;
const char *dbgName = DebugName ? DebugName : "";
ret->PaddingT = 2;
ret->PaddingB = 2;
- if( gaWM_WidgetTypes[Type].Init )
+ if( Type < ciWM_NumWidgetTypes && gaWM_WidgetTypes[Type].Init )
gaWM_WidgetTypes[Type].Init(ret);
WM_UpdateMinDims(ret->Parent);
return ret;
}
+/**
+ * \brief
+ */
+void AxWin_DeleteElement(tElement *Element)
+{
+ tElement *child, *next;
+
+ for(child = Element->FirstChild; child; child = next)
+ {
+ next = child->NextSibling;
+ AxWin_DeleteElement(child);
+ }
+
+ // TODO: Implement AxWin_DeleteElement
+ // TODO: Clean up related data.
+ if( Element->Type < ciWM_NumWidgetTypes && gaWM_WidgetTypes[Element->Type].Delete )
+ gaWM_WidgetTypes[Element->Type].Delete(Element);
+
+ free(Element);
+}
+
/**
* \brief Alter an element's flags
*/
-void WM_SetFlags(tElement *Element, int Flags)
+void AxWin_SetFlags(tElement *Element, int Flags)
{
// Permissions are handled in the message handler
if(!Element) {
return ;
}
-void WM_SetSize(tElement *Element, int Size)
+void AxWin_SetSize(tElement *Element, int Size)
{
if(!Element) return ;
Element->FixedWith = Size;
* \brief Set the text field of an element
* \note Used for the image path on ELETYPE_IMAGE
*/
-void WM_SetText(tElement *Element, char *Text)
+void AxWin_SetText(tElement *Element, const char *Text)
{
if(!Element) return ;
if(Element->Text) free(Element->Text);
}
}
break;
+ default: // Any other, no special case
+ break ;
}
return ;
*/
/**
* \brief Updates the dimensions of an element
+ * \todo What is the \a Pass parameter for
*
* The dimensions of an element are calculated from the parent's
* cross dimension (the side at right angles to the alignment) sans some
else
child->CachedW = with;
- WM_UpdateDimensions(child, 0);
+ WM_UpdateDimensions(child, Pass);
}
_SysDebug("%p'%s' Done", Element, Element->DebugName);