Usermode/axwin3 - Made menus auto-raised
[tpg/acess2.git] / Usermode / Applications / axwin3_src / WM / decorator.c
index 52ffbfb..6600408 100644 (file)
@@ -8,19 +8,24 @@
 #include <common.h>
 #include <wm.h>
 #include <decorator.h>
+#include <wm_messages.h>
+
+// === IMPORTS ===
+extern tWindow *gpWM_FocusedWindow;
 
 // === PROTOTYPES ===
 void   Decorator_UpdateBorderSize(tWindow *Window);
 void   Decorator_Redraw(tWindow *Window);
- int   Decorator_HandleMessage(tWindow *Window, int Message, int Length, void *Data);
+ int   Decorator_HandleMessage(tWindow *Window, int Message, int Length, const void *Data);
 
 // === CONSTANTS ===
-tColour        cColourActive_Titlebar   = 0xFF8800;
+tColour        cColourActive_Titlebar   = 0x00CC44;
 tColour        cColourActive_TitleText  = 0x000000;
 tColour        cColourInactive_Titlebar = 0xD0D0D0;
 tColour        cColourInactive_TitleText= 0x000000;
-tColour        cColour_SideBorder       = 0xD0D0D0;
-tColour        cColour_BottomBorder     = 0xD0D0D0;
+tColour        cColour_TitleTopBorder   = 0xFFFFFF;
+tColour        cColour_SideBorder       = 0x008000;
+tColour        cColour_BottomBorder     = 0x008000;
  int   ciTitlebarHeight        = 18;
  int   ciSideBorderWidth       = 2;
  int   ciBottomBorderWidth     = 4;
@@ -28,15 +33,14 @@ tColour     cColour_BottomBorder     = 0xD0D0D0;
 // === CODE ===
 void Decorator_UpdateBorderSize(tWindow *Window)
 {
-       Window->BorderT = 0;
+       Window->BorderT = ciTitlebarHeight;
        Window->BorderB = 0;
        Window->BorderL = 0;
        Window->BorderR = 0;
        
-       Window->BorderT = ciTitlebarHeight;
        if( Window->Flags & WINFLAG_MAXIMIZED )
                return ;
-       
+
        Window->BorderB = ciBottomBorderWidth;
        Window->BorderR = ciSideBorderWidth;
        Window->BorderL = ciSideBorderWidth;
@@ -44,58 +48,118 @@ void Decorator_UpdateBorderSize(tWindow *Window)
 
 void Decorator_Redraw(tWindow *Window)
 {
-        int    bActive = 1;
+        int    bActive = 0;
         int    text_width, text_height;
        
-       // TODO: Detect if window has focus
-       
+       // TODO: This could possibly be expensive, but is there a better way?
+       {
+               tWindow *win;
+               for(win = gpWM_FocusedWindow; win; win = win->Owner)
+               {
+                       if(win == Window) {
+                               bActive = 1;
+                               break;
+                       }
+               }
+       }
+
        // Draw title bar
+       // - Body
        WM_Render_FillRect(Window,
                0, -ciTitlebarHeight, Window->W, ciTitlebarHeight,
                (bActive ? cColourActive_Titlebar : cColourInactive_Titlebar)
                );
+       // - Top Border
+       WM_Render_FillRect(Window,
+               0, -ciTitlebarHeight, Window->W, 1,
+               cColour_TitleTopBorder
+               );
+       // - Sides
+       WM_Render_FillRect(Window,
+               0, -ciTitlebarHeight, 1, ciTitlebarHeight,
+               cColour_SideBorder
+               );
+       WM_Render_FillRect(Window,
+               Window->W, -ciTitlebarHeight, 1, ciTitlebarHeight,
+               cColour_SideBorder
+               );
 
+       // Get the font height
        WM_Render_GetTextDims(
                NULL,   // TODO: Select font
-               Window->Title ? Window->Title : "jI",
+               Window->Title ? Window->Title : "jI", -1,
                &text_width, &text_height
                );
+       // - Use that to draw the window title on the left of the window
        WM_Render_DrawText(Window,
                ciTitlebarHeight + 4, -(ciTitlebarHeight - (ciTitlebarHeight/2 - text_height/2)),
                Window->W - ciTitlebarHeight - 4, text_height,
                NULL,   // TODO: Select font
                (bActive ? cColourActive_TitleText : cColourInactive_TitleText),
-               Window->Title ? Window->Title : "--"
+               Window->Title ? Window->Title : "--", -1
                );
-       
+
+       // TODO: Minimise, Maximise and Close   
+
        // Maximized windows don't have any other borders
        if( Window->Flags & WINFLAG_MAXIMIZED )
                return ;
        
-       // Left
+       // Left Border
        WM_Render_FillRect(Window,
                -ciSideBorderWidth, -ciTitlebarHeight,
                ciSideBorderWidth, Window->H + ciTitlebarHeight + ciBottomBorderWidth,
                cColour_SideBorder
                );
-       // Right
+       // Right Border
        WM_Render_FillRect(Window,
                Window->W, -ciTitlebarHeight,
                ciSideBorderWidth, Window->H + ciTitlebarHeight + ciBottomBorderWidth,
                cColour_SideBorder
                );
-       // Bottom
+       // Bottom Border (hard line)
        WM_Render_FillRect(Window,
                -ciSideBorderWidth, Window->H,
-               ciSideBorderWidth*2+Window->W, ciBottomBorderWidth,
+               ciSideBorderWidth*2+Window->W, 1,
+               0x000000
+               );
+       // Bottom Border
+       WM_Render_FillRect(Window,
+               -ciSideBorderWidth, Window->H+1,
+               ciSideBorderWidth*2+Window->W, ciBottomBorderWidth-1,
                cColour_BottomBorder
                );
 }
 
-int Decorator_HandleMessage(tWindow *Window, int Message, int Length, void *Data)
+int Decorator_HandleMessage(tWindow *Window, int Message, int Length, const void *Data)
 {
+       static tWindow  *btn1_down;
        switch(Message)
        {
+       case WNDMSG_MOUSEMOVE: {
+               const struct sWndMsg_MouseMove  *msg = Data;
+
+               if( btn1_down == Window ) {
+                       WM_MoveWindow(Window, Window->X + msg->dX, Window->Y + msg->dY);
+                       return 0;
+               }
+
+               if(msg->Y >= 0) return 1;       // Pass
+
+               // TODO: Handle
+               return 0; }
+       case WNDMSG_MOUSEBTN: {
+               const struct sWndMsg_MouseButton        *msg = Data;
+               if( msg->Button == 0 && !msg->bPressed )
+                       btn1_down = 0;          
+
+               if(msg->Y >= 0) return 1;       // Pass
+       
+               if( msg->Button == 0 && msg->bPressed )
+                       btn1_down = Window;
+
+               // TODO: Handle
+               return 0; }
        default:        // Anything unhandled is passed on
                return 1;
        }

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