ecere: Android fixes; i18n update
[sdk] / ecere / src / gui / skins / WindowsSkin.ec
index 74a36c3..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)
@@ -176,7 +198,9 @@ public class WindowsSkin_Window : Window
          // PrintLn(_class.name, " is at l = ", rcWindow.left, ", r = ", rcWindow.right);
 #else
          Box widths = { 0 };
+#if !defined(__ANDROID__)
          XGetBorderWidths(this, widths);
+#endif
          *w += widths.left + widths.right;
          *h += widths.top + widths.bottom;
 #endif
@@ -260,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
@@ -382,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));
          }
@@ -413,7 +439,7 @@ public class WindowsSkin_Window : Window
       bool result = 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)
@@ -542,16 +568,16 @@ public class WindowsSkin_Window : Window
       {
          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;
@@ -559,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;
@@ -569,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:
@@ -590,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)