2 * Acess2 Window Manager v3
3 * - By John Hodge (thePowersGang)
6 * - Window manager core
9 #include <wm_renderer.h>
15 tWMRenderer *gpWM_Renderers;
16 tWindow *gpWM_RootWindow;
19 void WM_Initialise(void)
21 WM_CreateWindow(NULL, 0x0088FF, "Background");
22 gpWM_RootWindow->W = giScreenWidth;
23 gpWM_RootWindow->H = giScreenHeight;
24 gpWM_RootWindow->Flags = WINFLAG_SHOW;
27 void WM_RegisterRenderer(tWMRenderer *Renderer)
29 // TODO: Catch out duplicates
30 Renderer->Next = gpWM_Renderers;
31 gpWM_Renderers = Renderer;
34 tWindow *WM_CreateWindow(tWindow *Parent, int RendererArg, const char *RendererName)
36 tWMRenderer *renderer;
40 for( renderer = gpWM_Renderers; renderer; renderer = renderer->Next )
42 if(strcmp(RendererName, renderer->Name) == 0)
48 // - Call create window function
49 ret = renderer->CreateWindow(RendererArg);
51 ret->Renderer = renderer;
54 Parent = gpWM_RootWindow;
60 Parent->LastChild->NextSibling = ret;
62 Parent->FirstChild = ret;
63 ret->PrevSibling = Parent->LastChild;
64 Parent->LastChild = ret;
68 gpWM_RootWindow = ret;
75 tWindow *WM_CreateWindowStruct(size_t ExtraSize)
79 ret = calloc( sizeof(tWindow) + ExtraSize, 1 );
80 ret->RendererInfo = ret + 1; // Get end of tWindow
85 void WM_int_UpdateWindow(tWindow *Window)
89 // Ignore hidden windows
90 if( !(Window->Flags & WINFLAG_SHOW) )
92 // Ignore unchanged windows
93 if( Window->Flags & WINFLAG_CLEAN )
97 Window->Renderer->Redraw(Window);
100 for( child = Window->FirstChild; child; child = child->NextSibling )
102 WM_int_UpdateWindow(child);
105 Window->Flags |= WINFLAG_CLEAN;
108 void WM_int_BlitWindow(tWindow *Window)
112 // Ignore hidden windows
113 if( !(Window->Flags & WINFLAG_SHOW) )
116 Video_Blit(Window->RenderBuffer, Window->X, Window->Y, Window->W, Window->H);
118 for( child = Window->FirstChild; child; child = child->NextSibling )
120 WM_int_BlitWindow(child);
126 // Don't redraw if nothing has changed
127 if( gpWM_RootWindow->Flags & WINFLAG_CLEAN )
130 // - Iterate through visible windows, updating them as needed
131 WM_int_UpdateWindow(gpWM_RootWindow);
133 // - Draw windows from back to front to the render buffer
134 WM_int_BlitWindow(gpWM_RootWindow);
139 // --- WM Render Routines
140 // TODO: Move to another file?
141 void WM_Render_FilledRect(tWindow *Window, tColour Colour, int X, int Y, int W, int H)
145 _SysDebug("WM_Render_FilledRect(%p, 0x%x...", Window, Colour);
146 _SysDebug(" (%i,%i), %ix%i)", X, Y, W, H);
147 // Clip to window dimensions
148 if(X < 0) { W += X; X = 0; }
149 if(Y < 0) { H += Y; Y = 0; }
150 if(X >= Window->W) return;
151 if(Y >= Window->H) return;
152 if(X + W > Window->W) W = Window->W - X;
153 if(Y + H > Window->H) H = Window->H - Y;
154 _SysDebug(" Clipped to (%i,%i), %ix%i", X, Y, W, H);
159 if(!Window->RenderBuffer) {
160 Window->RenderBuffer = malloc(Window->W*Window->H*4);
163 dest = (uint32_t*)Window->RenderBuffer + Y*Window->W + X;
168 dest += Window->W - W;