Usermode/libc - Fix strchr and strrchr behavior
[tpg/acess2.git] / Usermode / Applications / axwin3_src / WM / wm.c
index 4b28d11..cc7e86e 100644 (file)
 #include <video.h>
 #include <wm_messages.h>
 #include <decorator.h>
+#include <axwin3/keysyms.h>
+#include <wm_hotkeys.h>
 
 // === IMPORTS ===
+extern int     Renderer_Menu_Init(void);
+extern int     Renderer_Widget_Init(void);
+extern int     Renderer_Background_Init(void);
+extern int     Renderer_Framebuffer_Init(void);
+extern int     Renderer_RichText_Init(void);
+
 extern void    IPC_SendWMMessage(tIPC_Client *Client, uint32_t Src, uint32_t Dst, int Msg, int Len, const void *Data);
 extern void    IPC_SendReply(tIPC_Client *Client, uint32_t WinID, int MsgID, size_t Len, const void *Data);
 extern tWindow *IPC_int_GetWindow(tIPC_Client *Client, uint32_t ID);
+extern void    IPC_int_SetWindow(tIPC_Client *Client, uint32_t ID, tWindow *Window);
 
 // === GLOBALS ===
 tWMRenderer    *gpWM_Renderers;
@@ -29,15 +38,40 @@ tWindow     *gpWM_HilightedWindow;
 // === CODE ===
 void WM_Initialise(void)
 {
+       // TODO: Autodetect these
+       Renderer_Menu_Init();
+       Renderer_Widget_Init();
+       Renderer_Background_Init();
+       Renderer_Framebuffer_Init();
+       Renderer_RichText_Init();
+       
        WM_CreateWindow(NULL, NULL, 0, 0x0088FF, "Background");
        gpWM_RootWindow->W = giScreenWidth;
        gpWM_RootWindow->H = giScreenHeight;
        gpWM_RootWindow->Flags = WINFLAG_SHOW|WINFLAG_NODECORATE;
+
+       // TODO: Move these to config
+       uint32_t        keys[4];
+       keys[0] = KEYSYM_LEFTGUI;       keys[1] = KEYSYM_r;
+       WM_Hotkey_Register(2, keys, "Interface>Run");
+       keys[0] = KEYSYM_LEFTGUI;       keys[1] = KEYSYM_t;
+       WM_Hotkey_Register(2, keys, "Interface>Terminal");
+       keys[0] = KEYSYM_LEFTGUI;       keys[1] = KEYSYM_e;
+       WM_Hotkey_Register(2, keys, "Interface>TextEdit");
 }
 
 void WM_RegisterRenderer(tWMRenderer *Renderer)
 {
-       // TODO: Catch out duplicates
+       // Catch out duplicates
+       for(tWMRenderer *r = gpWM_Renderers; r; r = r->Next ) {
+               if( r == Renderer ) {
+                       return ;
+               }
+               if( strcmp(r->Name, Renderer->Name) == 0 ) {
+                       return ;
+               }
+       }
+       
        Renderer->Next = gpWM_Renderers;
        gpWM_Renderers = Renderer;
 }
@@ -113,7 +147,8 @@ void WM_DestroyWindow(tWindow *Window)
                        Window->Parent->LastChild = prev;
        }
        // - Full invalidate
-       WM_Invalidate(Window, 1);
+       WM_Invalidate(Window, 0);
+       Window->Parent->Flags &= ~WINFLAG_CLEAN;        // Mark parent as unclean, forcing redraw
        
        // - Remove from inheritance tree?
        
@@ -144,6 +179,7 @@ void WM_DestroyWindow(tWindow *Window)
        free(Window->Title);
        free(Window->RenderBuffer);
        free(Window);
+       IPC_int_SetWindow(Window->Client, Window->ID, NULL);
 }
 
 tWindow *WM_GetWindowByID(tWindow *Requester, uint32_t ID)
@@ -566,6 +602,7 @@ void WM_int_BlitWindow(tWindow *Window, int bForceReblit)
                bForceReblit = 1;
        }
        
+       // Draw cursor
        if( Window == gpWM_FocusedWindow && Window->CursorW )
        {
                Video_FillRect(

UCC git Repository :: git.ucc.asn.au