ecere: Android fixes; i18n update
[sdk] / ecere / src / gui / skins / WindowsSkin.ec
index 0a6043c..5d240ac 100644 (file)
@@ -1,8 +1,12 @@
 #if defined(WIN32)
 #define WIN32_LEAN_AND_MEAN
+#define String _String
 #define Method _Method
+#define strlen _strlen
 #include <windows.h>
 #undef Method
+#undef String
+#undef strlen
 #endif
 
 import "Window"
@@ -17,12 +21,22 @@ namespace gui::skins;
 #define TOP          4
 #define BOTTOM       4
 #define CORNER       (BORDER * 2)
+#if defined(HIGH_DPI)
+#define BUTTON_SIZE  45
+#define CAPTION      60
+#else
+#define BUTTON_SIZE  15
 #define CAPTION      20
+#endif
 #define DEAD_BORDER  3
 #define MIN_WIDTH    60
 #define MIN_HEIGHT   3
 #define BUTTON_OFFSET   2
+#if defined(HIGH_DPI)
+#define NAME_OFFSET   12
+#else
 #define NAME_OFFSET   2
+#endif
 #define NAME_OFFSETX  4
 
 #define SB_WIDTH  16
@@ -122,12 +136,20 @@ class WindowsSkin : Skin
 
    FontResource ::SystemFont()
    {
+#if defined(HIGH_DPI)
+      return FontResource { faceName = $"Tahoma", size = 18.25f };
+#else
       return FontResource { faceName = $"Tahoma", size = 8.25f };
+#endif
    }
 
    FontResource ::CaptionFont()
    {
+#if defined(HIGH_DPI)
+      return FontResource { faceName = $"Tahoma", size = 18.25f, bold = true };
+#else
       return FontResource { faceName = $"Tahoma", size = 8.25f, bold = true };
+#endif
    }
 
    char * ::CursorsBitmaps(uint id, int * hotSpotX, int *hotSpotY, byte ** paletteShades)
@@ -163,19 +185,22 @@ public class WindowsSkin_Window : Window
          *h += statusBarHeight;
       }
 
-      if(nativeDecorations && rootWindow == this)
+      if(nativeDecorations && rootWindow == this && windowHandle)
       {
 #if defined(WIN32)
-         RECT rcClient, rcWindow;
-         GetClientRect(windowHandle, &rcClient);
-         GetWindowRect(windowHandle, &rcWindow);
-         *w += (rcWindow.right - rcWindow.left) - rcClient.right;
-         *h += (rcWindow.bottom - rcWindow.top) - rcClient.bottom;
+         RECT rcClient = { 0 }, rcWindow = { 0 };
+         if(GetClientRect(windowHandle, &rcClient) && GetWindowRect(windowHandle, &rcWindow))
+         {
+            *w += (rcWindow.right - rcWindow.left) - rcClient.right;
+            *h += (rcWindow.bottom - rcWindow.top) - rcClient.bottom;
+         }
 
          // PrintLn(_class.name, " is at l = ", rcWindow.left, ", r = ", rcWindow.right);
 #else
-         Box widths;
+         Box widths = { 0 };
+#if !defined(__ANDROID__)
          XGetBorderWidths(this, widths);
+#endif
          *w += widths.left + widths.right;
          *h += widths.top + widths.bottom;
 #endif
@@ -210,7 +235,7 @@ public class WindowsSkin_Window : Window
    void SetWindowMinimum(MinMaxValue * mw, MinMaxValue * mh)
    {
       bool isNormal = (state == normal);
-      if(nativeDecorations && rootWindow == this) return;
+      if(nativeDecorations && rootWindow == this && windowHandle) return;
       if(((BorderBits)borderStyle).fixed && (state != maximized || !GetParentMenuBar()))
       {
          *mw = MIN_WIDTH;
@@ -249,7 +274,7 @@ public class WindowsSkin_Window : Window
 
       GetDecorationsSize(&aw, &ah);
 
-      if(nativeDecorations && rootWindow == this)
+      if(nativeDecorations && rootWindow == this && windowHandle)
       {
 #if defined(WIN32)
          RECT rcWindow;
@@ -259,8 +284,10 @@ public class WindowsSkin_Window : Window
          *x += client00.x - rcWindow.left;
          *y += client00.y - rcWindow.top;
 #else
-         Box widths;
+         Box widths = { 0 };
+#if !defined(__ANDROID__)
          XGetBorderWidths(this, widths);
+#endif
          *x += widths.left;
          *y += widths.top;
 #endif
@@ -311,7 +338,7 @@ public class WindowsSkin_Window : Window
       int top = 0, border = 0, bottom = 0;
       Window parentMenuBar = GetParentMenuBar();
 
-      if(nativeDecorations && rootWindow == this) return;
+      if(nativeDecorations && rootWindow == this && windowHandle) return;
 
       if(state == minimized)
          top = border = bottom = DEAD_BORDER;
@@ -354,7 +381,7 @@ public class WindowsSkin_Window : Window
          {
             // Frame for ES_CAPTION windows
             surface.Bevel(false, 0, 0, size.w, size.h);
-            surface.SetForeground(activeBorder);
+            surface.SetForeground(formColor);
             surface.Rectangle(2, 2, size.w-3, size.h-3);
 
             // Resizeable frame is 1 pixel thicker 
@@ -371,7 +398,7 @@ public class WindowsSkin_Window : Window
             GRADIENT_SMOOTHNESS, GRADIENT_DIRECTION,
                border, top, size.w - border - 1, top + CAPTION - 2);
 
-         surface.SetForeground(activeBorder);
+         surface.SetForeground(formColor);
          if(state != minimized)
             surface.HLine(border, size.w-border-1, top + CAPTION-1);
 
@@ -381,7 +408,7 @@ public class WindowsSkin_Window : Window
          if(name)
          {
             int buttonsSize = border +
-               ((hasMaximize || hasMinimize) ? 52 : 18);
+               ((hasMaximize || hasMinimize) ? (BUTTON_SIZE*3)+7 : (BUTTON_SIZE+3));
             surface.WriteTextDots(left, border + NAME_OFFSETX, top + NAME_OFFSET, 
                size.w - (buttonsSize + border + 4), name, strlen(name));
          }
@@ -396,7 +423,7 @@ public class WindowsSkin_Window : Window
       {
          if(sbh && sbh.visible && sbv && sbv.visible)
          {
-            surface.SetBackground(activeBorder);
+            surface.SetBackground(formColor);
             surface.Area(
                clientStart.x + clientSize.w,
                clientStart.y + clientSize.h,
@@ -410,9 +437,9 @@ public class WindowsSkin_Window : Window
    {
       bool isNormal = (state == normal);
       bool result = false;
-      if(nativeDecorations && rootWindow == this) return false;
+      if(nativeDecorations && rootWindow == this && windowHandle) return false;
 
-      if(((BorderBits\)borderStyle).fixed && (state != maximized || !GetParentMenuBar()))
+      if(((BorderBits)borderStyle).fixed && (state != maximized || !GetParentMenuBar()))
       {
          int corner = 0, border = 0, top = 0;
          if(((BorderBits)borderStyle).sizable && isNormal)
@@ -435,7 +462,7 @@ public class WindowsSkin_Window : Window
       bool result = false;
 
       *resizeX = *resizeY = *resizeEndX = *resizeEndY = false;
-      if(nativeDecorations && rootWindow == this) return false;
+      if(nativeDecorations && rootWindow == this && windowHandle) return false;
 
       if(((BorderBits)borderStyle).sizable && (state == normal))
       {
@@ -473,7 +500,7 @@ public class WindowsSkin_Window : Window
       int top = 0, border = 0;
       int insideBorder = 0;
 
-      if(!nativeDecorations || rootWindow != this)
+      if(!nativeDecorations || rootWindow != this || !windowHandle)
       {
          if(state == minimized)
             top = border = DEAD_BORDER;
@@ -525,7 +552,7 @@ public class WindowsSkin_Window : Window
          else
          {
             statusBar.visible = true;
-            if(nativeDecorations && rootWindow == this)
+            if(nativeDecorations && rootWindow == this && windowHandle)
             {
                statusBar.anchor = { left = clientStart.x, bottom = (int)(size.h - clientSize.h - clientStart.y - statusBarHeight ) };
                statusBar.size.w = size.w - insideBorder * 2;
@@ -537,20 +564,20 @@ public class WindowsSkin_Window : Window
             }
          }
       }
-      if(!nativeDecorations || rootWindow != this)
+      if(!nativeDecorations || rootWindow != this || !windowHandle)
       {
          if(sysButtons[0])
          {
-            sysButtons[0].anchor = { right = 35 + border, top = top + BUTTON_OFFSET };
-            sysButtons[0].size = { 15, 15 };
+            sysButtons[0].anchor = { right = 2+(2*BUTTON_SIZE+3) + border, top = top + BUTTON_OFFSET };
+            sysButtons[0].size = { BUTTON_SIZE, BUTTON_SIZE };
             sysButtons[0].bevel = true;
             sysButtons[0].bitmap = { skinBitmaps[(state == minimized) ? restore : minimize] };
             sysButtons[0].visible = true;
          }
          if(sysButtons[1])
          {
-            sysButtons[1].anchor = { right = 20 + border, top = top + BUTTON_OFFSET };
-            sysButtons[1].size = { 15, 15 };
+            sysButtons[1].anchor = { right = 2+(BUTTON_SIZE+3) + border, top = top + BUTTON_OFFSET };
+            sysButtons[1].size = { BUTTON_SIZE, BUTTON_SIZE };
             sysButtons[1].bevel = true;
             sysButtons[1].bitmap = { skinBitmaps[(state == maximized) ? restore : maximize] };
             sysButtons[1].visible = true;
@@ -558,7 +585,7 @@ public class WindowsSkin_Window : Window
          if(sysButtons[2])
          {
             sysButtons[2].anchor = { right = 2 + border, top = top + BUTTON_OFFSET };
-            sysButtons[2].size = { 15, 15 };
+            sysButtons[2].size = { BUTTON_SIZE, BUTTON_SIZE };
             sysButtons[2].bevel = true;
             sysButtons[2].bitmap = { skinBitmaps[close] };
             sysButtons[2].visible = true;
@@ -568,7 +595,7 @@ public class WindowsSkin_Window : Window
 }
 
 
-#define PUREVTBL(c)     ((int (**)())*(void **)((byte *)class(c).data + 4))
+#define PUREVTBL(c)     (*(void ***)((byte *)class(c).data + sizeof(uintptr)))
 #define CAPTION_DISTANCE   18
 
 default:
@@ -589,7 +616,7 @@ public class WindowsSkin_Button : Button
    {
       if(isRadio)
       {
-         PUREVTBL(Button)[__ecereVMethodID___ecereNameSpace__ecere__gui__Window_OnRedraw](this, surface);
+         ((void (*)(Window, Surface))PUREVTBL(Button)[__ecereVMethodID___ecereNameSpace__ecere__gui__Window_OnRedraw])(this, surface);
          return;
       }
       // if(bevel)
@@ -638,12 +665,12 @@ public class WindowsSkin_Button : Button
             int start = (clientSize.h - height) / 2;
 
             if(!isEnabled)
-               // surface.SetBackground(activeBorder);
+               // surface.SetBackground(formColor);
                surface.SetBackground(gainsboro);
             else if(active && !text)
-               surface.SetBackground((offset ? activeBorder : Color { 0,0,170 }));
+               surface.SetBackground((offset ? formColor : Color { 0,0,170 }));
             else
-               surface.SetBackground((offset ? activeBorder : white));
+               surface.SetBackground((offset ? formColor : white));
             surface.Area(2, start+2,height-3,start+height-3);
 
             surface.SetForeground(Color { 85, 85, 85 });