framewin.c
上传用户:zbk8730
上传日期:2017-08-10
资源大小:12168k
文件大小:17k
源码类别:

uCOS

开发平台:

C/C++

  1. /*
  2. *********************************************************************************************************
  3. *                                                uC/GUI
  4. *                        Universal graphic software for embedded applications
  5. *
  6. *                       (c) Copyright 2002, Micrium Inc., Weston, FL
  7. *                       (c) Copyright 2002, SEGGER Microcontroller Systeme GmbH
  8. *
  9. *              礐/GUI is protected by international copyright laws. Knowledge of the
  10. *              source code may not be used to write a similar product. This file may
  11. *              only be used in accordance with a license and should not be redistributed
  12. *              in any way. We appreciate your understanding and fairness.
  13. *
  14. ----------------------------------------------------------------------
  15. File        : FRAMEWIN.c
  16. Purpose     : Framewindow for emWin GSC
  17. ---------------------------END-OF-HEADER------------------------------
  18. */
  19. #include <stdlib.h>
  20. #include <string.h>
  21. #include "FRAMEWIN.h"
  22. #include "WIDGET.h"
  23. #include "GUI_Protected.h"
  24. #if GUI_WINSUPPORT
  25. /*
  26.   *****************************************************************
  27.   *                                                               *
  28.   *              Config defaults                                  *
  29.   *                                                               *
  30.   *****************************************************************
  31. */
  32. /* Support for 3D effects */
  33. #ifndef FRAMEWIN_USE_3D
  34.   #define FRAMEWIN_USE_3D 1
  35. #endif
  36. #ifndef FRAMEWIN_CLIENTCOLOR_DEFAULT
  37.   #define FRAMEWIN_CLIENTCOLOR_DEFAULT 0xc0c0c0
  38. #endif
  39. /* Default for top frame size */
  40. #ifndef FRAMEWIN_CAPTIONSIZE_DEFAULT
  41.   #define FRAMEWIN_CAPTIONSIZE_DEFAULT 12
  42. #endif
  43. /* Default for left/right/top/bottom frame size */
  44. #ifndef FRAMEWIN_BORDER_DEFAULT
  45.   #define FRAMEWIN_BORDER_DEFAULT 3
  46. #endif
  47. /* Default for inner frame size */
  48. #ifndef FRAMEWIN_IBORDER_DEFAULT
  49.   #define FRAMEWIN_IBORDER_DEFAULT 1
  50. #endif
  51. #ifndef FRAMEWIN_DEFAULT_FONT
  52.   #define FRAMEWIN_DEFAULT_FONT &GUI_Font8_1
  53. #endif
  54. #ifndef FRAMEWIN_BARCOLOR_ACTIVE_DEFAULT
  55.   #define FRAMEWIN_BARCOLOR_ACTIVE_DEFAULT 0xff0000
  56. #endif
  57. #ifndef FRAMEWIN_BARCOLOR_INACTIVE_DEFAULT
  58.   #define FRAMEWIN_BARCOLOR_INACTIVE_DEFAULT 0x404040
  59. #endif
  60. #ifndef FRAMEWIN_FRAMECOLOR_DEFAULT
  61.   #define FRAMEWIN_FRAMECOLOR_DEFAULT 0xaaaaaa
  62. #endif
  63. /************************************************************
  64. *
  65. *                 Object definition
  66. *
  67. *************************************************************
  68. */
  69. typedef struct {
  70.   WIDGET Widget;
  71.   GUI_COLOR BarColor[2];
  72.   GUI_COLOR TextColor;
  73.   WM_CALLBACK* cb;
  74.   WM_HWIN hClient;
  75.   GUI_POINT CapturePoint;
  76.   const GUI_FONT* pFont;
  77.   GUI_RECT rClient;
  78.   GUI_COLOR ClientColor;
  79.   const char* pText;
  80.   I16 XOff, YOff;
  81.   I16 FrameSize;
  82.   I16 TitleHeight;
  83.   I16 TextAlign;
  84.   U16 Flags;
  85.   WM_HWIN hFocussedChild;          /* Handle to focussed child .. default none (0) */
  86. //  char HasFocus;
  87. } FRAMEWIN_Obj;
  88. /*********************************************************************
  89. *
  90. *       Static data
  91. *
  92. **********************************************************************
  93. */
  94. static const GUI_FONT* _pDefaultFont = FRAMEWIN_DEFAULT_FONT;
  95. static   GUI_COLOR _aBarColor[2] = {
  96.   FRAMEWIN_BARCOLOR_INACTIVE_DEFAULT,
  97.   FRAMEWIN_BARCOLOR_ACTIVE_DEFAULT
  98. };
  99. static GUI_COLOR _DefaultClientColor = FRAMEWIN_CLIENTCOLOR_DEFAULT;
  100. static int _DefaultCaptionSize       = FRAMEWIN_CAPTIONSIZE_DEFAULT;
  101. static int _DefaultBorderSize        = FRAMEWIN_BORDER_DEFAULT;
  102. /*
  103.   ********************************************************************
  104.   *                                                                  *
  105.   *                 Macros for internal use                          *
  106.   *                                                                  *
  107.   ********************************************************************
  108. */
  109. #define FRAMEWIN_H2P(h) (FRAMEWIN_Obj*) WM_HMEM2Ptr(h)
  110. /*
  111. ********************************************************************
  112. *                                                                  *
  113. *                    Static routines                               *
  114. *                                                                  *
  115. ********************************************************************
  116. */
  117. static void _OnTouch(FRAMEWIN_Handle hWin, FRAMEWIN_Obj* pObj, WM_MESSAGE* pMsg) {
  118.   GUI_TOUCH_tState* pState;
  119.   pState = (GUI_TOUCH_tState*)pMsg->Data.p;
  120.   if (pMsg->Data.p) {  /* Something happened in our area (pressed or released) */
  121.     if (pState->Pressed) {
  122.       WM_SetFocus(hWin);
  123.       WM_BringToTop(hWin);
  124.       if (pObj->Flags & FRAMEWIN_SF_MOVEABLE) {
  125.         if (!WM_HasCaptured(hWin)) {
  126.           WM_SetCapture(hWin, 1);
  127.           pObj->CapturePoint.x = pState->x;
  128.           pObj->CapturePoint.y = pState->y;
  129.         } else {
  130.           int dx, dy;
  131.           dx = pState->x - pObj->CapturePoint.x;
  132.           dy = pState->y - pObj->CapturePoint.y;
  133.           WM_MoveWindow(hWin, dx, dy);
  134.         }
  135.       }
  136.     }
  137.   }
  138. }
  139. static void _Paint(FRAMEWIN_Obj* pObj) {
  140.   WM_HWIN hWin = WM_GetActiveWindow();
  141.   int xsize = WM_GetWindowSizeX(hWin);
  142.   int ysize = WM_GetWindowSizeY(hWin);
  143.   int FrameSize = pObj->FrameSize;
  144.   GUI_RECT rClient; GUI_GetClientRect(&rClient);
  145.   GUI_SetFont(pObj->pFont);
  146. /* Draw Title */
  147.   GUI_SetBkColor((pObj->Widget.State & WIDGET_STATE_CHILD_HAS_FOCUS) ? pObj->BarColor[1] : pObj->BarColor[0]);
  148.   GUI_SetColor  (pObj->TextColor);
  149.   GUI_SetTextAlign(pObj->TextAlign);
  150. GUI_ClearRect(FrameSize,FrameSize, xsize-1-FrameSize, FrameSize+pObj->rClient.y0-1);
  151.   GUI_DispStringAt( pObj->pText,
  152.                    FrameSize+pObj->XOff,
  153.                    FrameSize+pObj->YOff);
  154. /* Draw Frame */
  155.   GUI_SetColor  (FRAMEWIN_FRAMECOLOR_DEFAULT);  /* pObj->BarColor[1]*/
  156.   GUI_FillRect  (0, 0, xsize-1, FrameSize-1);
  157. GUI_FillRect  (0, 0, pObj->rClient.x0-1, ysize-1);
  158. GUI_FillRect  (pObj->rClient.x1+1, 0, xsize-1, ysize-1);
  159.   GUI_FillRect  (0, pObj->rClient.y1+1, xsize-1, ysize-1);
  160.   GUI_FillRect  (0, pObj->TitleHeight+FrameSize,
  161.                     xsize-1, pObj->TitleHeight+2*FrameSize-1);
  162. /* Draw Client area */
  163.   WM_SetUserClipArea(&pObj->rClient);
  164.   /*GUI_SetBkColor(pObj->ClientColor);
  165.   GUI_Clear();*/
  166.   WM_SetUserClipArea(NULL);
  167. /* Draw the 3D effect (if configured) */
  168.   #if FRAMEWIN_USE_3D
  169.     WIDGET_EFFECT_3D_DrawUp();
  170.   #endif
  171.   
  172. }
  173. static void CalcPositions( FRAMEWIN_Handle hObj) {
  174.   if (hObj) {
  175.     FRAMEWIN_Obj * pObj = FRAMEWIN_H2P(hObj);
  176.     int TitleHeight;
  177.     int FontSize = GUI_GetYSizeOfFont(pObj->pFont);
  178.     int xsize = WM_GetWindowSizeX(hObj);
  179.     int ysize = WM_GetWindowSizeY(hObj);
  180.     TitleHeight = _DefaultCaptionSize;
  181.     /* Make sure defaults are o.k. for us */
  182.     if (FontSize + 2 >= TitleHeight)
  183.       TitleHeight = FontSize + 2;
  184.     /* Set object properties accordingly */
  185.     pObj->rClient.x0  =         _DefaultBorderSize;
  186.     pObj->rClient.x1  = xsize - _DefaultBorderSize - 1;
  187.     pObj->rClient.y0  =         _DefaultBorderSize + FRAMEWIN_IBORDER_DEFAULT + TitleHeight;
  188.     pObj->rClient.y1  = ysize - _DefaultBorderSize - 1;
  189.     pObj->FrameSize   =         _DefaultBorderSize;
  190.     pObj->TitleHeight = TitleHeight;
  191.     if (pObj->hClient) {
  192.       WM_MoveTo (pObj->hClient, 
  193.                  pObj->rClient.x0 + pObj->Widget.Win.Rect.x0, 
  194.                  pObj->rClient.y0 + pObj->Widget.Win.Rect.y0);
  195.       WM_SetSize(pObj->hClient, 
  196.                  pObj->rClient.x1 - pObj->rClient.x0 + 1, 
  197.                  pObj->rClient.y1 - pObj->rClient.y0 + 1);
  198.     }
  199.   }  
  200. }
  201. /*********************************************************************
  202. *
  203. *       Framewin Callback
  204. */
  205. static void _FRAMEWIN_Callback (WM_MESSAGE *pMsg) {
  206.   FRAMEWIN_Handle hWin = (FRAMEWIN_Handle)(pMsg->hWin);
  207.   FRAMEWIN_Obj* pObj = FRAMEWIN_H2P(hWin);
  208.   GUI_RECT* pRect = (GUI_RECT*)(pMsg->Data.p);
  209.   switch (pMsg->MsgId) {
  210.   case WM_PAINT:
  211.     _Paint(pObj);
  212.     break;
  213.   case WM_TOUCH:
  214.     _OnTouch(hWin, pObj, pMsg);
  215.     return;                       /* Return here ... Message handled */
  216.   case WM_GETCLIENTRECT:
  217. *pRect = pObj->rClient;
  218.     return;                       /* Return here ... Message handled */
  219.   case WM_GETCLIENTRECT_ABS:  /* Do not seperate from WM_GETCLIENTRECT !!! */
  220.   *pRect = pObj->rClient;
  221.     GUI_MoveRect(pRect, pObj->Widget.Win.Rect.x0, pObj->Widget.Win.Rect.y0);
  222.     return;                       /* Return here ... Message handled */
  223.   case WM_GET_CLIENT_WINDOW:      /* return handle to client window. For most windows, there is no seperate client window, so it is the same handle */
  224.     pMsg->Data.v = pObj->hClient;
  225.     return;                       /* Return here ... Message handled */
  226.   case WM_GET_FOCUSSED_CHILD:
  227.     pMsg->Data.v = pObj->hFocussedChild;
  228.     return;                       /* Return here ... Message handled */
  229.   case WM_SET_FOCUS:
  230.     if (pMsg->Data.v == 1) {
  231.       WM_SetFocus(pObj->hFocussedChild);
  232.     } else {
  233.       WM_SetFocus(0);
  234.     }
  235.     return;
  236.   }
  237.   /* Let widget handle the standard messages */
  238.   if (WIDGET_HandleActive(hWin, pMsg) == 0) {
  239.     return;
  240.   }
  241.   WM_DefaultProc(pMsg);
  242. }
  243. /*********************************************************************
  244. *
  245. *       Client Callback
  246. */
  247. static void FRAMEWIN__cbClient(WM_MESSAGE* pMsg) {
  248.   WM_HWIN hWin    = pMsg->hWin;
  249.   WM_HWIN hParent = WM_GetParent(pMsg->hWin);
  250.   FRAMEWIN_Obj* pObj = FRAMEWIN_H2P(hParent);
  251.   WM_CALLBACK* cb = pObj->cb;
  252.   switch (pMsg->MsgId) {
  253.     case WM_PAINT:
  254.       GUI_SetBkColor(pObj->ClientColor);
  255.       GUI_Clear();
  256.       if (pObj->cb) {
  257.       WM_MESSAGE msg;
  258.         msg.hWin   = hWin;
  259.     msg.MsgId  = WM_PAINT;
  260.         (*pObj->cb)(&msg);
  261.       }
  262.       return;
  263.     case WM_GET_FOCUSSED_CHILD:
  264.       pMsg->Data.v = pObj->hFocussedChild;
  265.       return;
  266.     case WM_SET_FOCUS:
  267.       if (pMsg->Data.v) {      /* Focus received */
  268.         if (pObj->hFocussedChild) {
  269.           WM_SendMessage(pObj->hFocussedChild, pMsg);
  270.         } else {
  271.           pObj->hFocussedChild = WM_SetFocusOnNextChild(hWin);
  272.         }
  273.       }
  274.       return;
  275.     case WM_KEY:
  276.       if ( ((WM_KEY_INFO*)(pMsg->Data.p))->PressedCnt >0) {
  277.         int Key = ((WM_KEY_INFO*)(pMsg->Data.p))->Key;
  278.         switch (Key) {
  279.           case GUI_KEY_TAB:
  280.             pObj->hFocussedChild = WM_SetFocusOnNextChild(hWin);
  281.             break;                    /* Send to parent by not doing anything */
  282.         }
  283.       }
  284.       break;
  285.     case WM_NOTIFY_CHILD_HAS_FOCUS:
  286.       pObj->hFocussedChild = pMsg->hWinSrc;
  287.       if (pMsg->Data.v) {
  288.         pObj->Widget.State |= WIDGET_STATE_CHILD_HAS_FOCUS;
  289.       } else {
  290.         pObj->Widget.State &= ~WIDGET_STATE_CHILD_HAS_FOCUS;
  291.       }
  292.       WM_InvalidateWindow(hParent);
  293.       break;
  294.     case WM_GET_BKCOLOR:
  295.       pMsg->Data.Color = pObj->ClientColor;
  296.       return;                       /* Message handled */
  297.     case WM_GETCLIENTRECT_ABS:      /* return client window in absolute (screen) coordinates */
  298.     case WM_GET_CLIENT_WINDOW:      /* return handle to client window. For most windows, there is no seperate client window, so it is the same handle */
  299.       WM_DefaultProc(pMsg);
  300.       return;                       /* We are done ! */
  301.   }
  302.   if (cb) {
  303.     pMsg->hWin = hParent;
  304.     (*cb)(pMsg);
  305.   }
  306. }
  307. /*********************************************************************
  308. *
  309. *        Exported routines:  Create
  310. *
  311. **********************************************************************
  312. */
  313. FRAMEWIN_Handle FRAMEWIN_CreateAsChild( 
  314.                                     int x0, int y0, int xsize, int ysize, WM_HWIN hParent,
  315.                                     const char* pText, WM_CALLBACK* cb, int Flags)
  316. {
  317.   FRAMEWIN_Handle hObj;
  318.   /* Create the window */
  319.   GUI_LOCK();
  320.   hObj = WM_CreateWindowAsChild(x0, y0, xsize/*+2*HBorder*/, ysize/*+TBorder+BBorder*/, hParent,
  321.                         Flags, _FRAMEWIN_Callback, sizeof(FRAMEWIN_Obj) - sizeof(WM_Obj));
  322.   if (hObj) {
  323.     FRAMEWIN_Obj* pObj = FRAMEWIN_H2P(hObj);
  324.     /* init widget specific variables */
  325.     WIDGET__Init(&pObj->Widget, WIDGET_STATE_FOCUSSABLE | WIDGET_STATE_ENABLED);
  326.     /* init member variables */
  327.     pObj->pFont = _pDefaultFont;
  328.     memcpy(pObj->BarColor, _aBarColor, sizeof(pObj->BarColor));
  329.     pObj->TextColor    = 0xffffff;
  330.     pObj->TextAlign    = GUI_TA_LEFT;
  331.     pObj->ClientColor  = _DefaultClientColor;
  332.     pObj->pText        = pText;
  333.     pObj->XOff = 1;
  334.     pObj->YOff = 1;
  335.     pObj->cb = cb;
  336.     CalcPositions(hObj);
  337.     pObj->hClient = WM_CreateWindowAsChild(0, 0, 0, 0, hObj, WM_CF_SHOW, FRAMEWIN__cbClient, 0);
  338.   }
  339.   GUI_UNLOCK();
  340.   return hObj;
  341. }
  342. FRAMEWIN_Handle FRAMEWIN_Create( const char* pText,
  343.                                     WM_CALLBACK* cb,
  344.                                     int Flags,
  345.                                     int x0, int y0, int xsize, int ysize) {
  346.   return FRAMEWIN_CreateAsChild(x0, y0, xsize, ysize, WM_HWIN_NULL, pText, cb, Flags);
  347. }
  348. FRAMEWIN_Handle FRAMEWIN_CreateIndirect(const GUI_WIDGET_CREATE_INFO* pCreateInfo, WM_HWIN hWinParent, int x0, int y0, WM_CALLBACK* pCallback) {
  349.   FRAMEWIN_Handle hObj;
  350.   hObj = FRAMEWIN_CreateAsChild(
  351.     pCreateInfo->x0 + x0, pCreateInfo->y0 + y0, pCreateInfo->xSize, pCreateInfo->ySize, hWinParent,
  352.     pCreateInfo->pName, pCallback, 0);
  353.   if (hObj) {
  354.     FRAMEWIN_Obj* pObj = FRAMEWIN_H2P(hObj);
  355.     pObj->Flags = pCreateInfo->Flags;
  356.   }
  357.   return hObj;
  358. }
  359. /*********************************************************************
  360. *
  361. *        Exported routines:  Various methods
  362. *
  363. **********************************************************************
  364. */
  365. void FRAMEWIN_SetFont(FRAMEWIN_Handle hObj, const GUI_FONT* pFont) {
  366.   GUI_LOCK();
  367.   if (hObj) {
  368.     FRAMEWIN_Obj* pObj = FRAMEWIN_H2P(hObj);
  369.     pObj->pFont = pFont;
  370.     CalcPositions(hObj);
  371.     FRAMEWIN_Invalidate(hObj);
  372.   }
  373.   GUI_UNLOCK();
  374. }
  375. void FRAMEWIN_SetBarColor(FRAMEWIN_Handle hObj, int index, GUI_COLOR color) {
  376.   GUI_LOCK();
  377.   if (hObj) {
  378.     FRAMEWIN_Obj* pObj = FRAMEWIN_H2P(hObj);
  379.     pObj->BarColor[index] = color;
  380.     FRAMEWIN_Invalidate(hObj);
  381.   }
  382.   GUI_UNLOCK();
  383. }
  384. void FRAMEWIN_SetTextColor(FRAMEWIN_Handle hObj, GUI_COLOR color) {
  385.   GUI_LOCK();
  386.   if (hObj) {
  387.     FRAMEWIN_Obj* pObj = FRAMEWIN_H2P(hObj);
  388.     pObj->TextColor = color;
  389.     FRAMEWIN_Invalidate(hObj);
  390.   }
  391.   GUI_UNLOCK();
  392. }
  393. void FRAMEWIN_SetText(FRAMEWIN_Handle hObj, const char* s) {
  394.   char NeedsInvalidate;
  395.   GUI_LOCK();
  396.   if (hObj) {
  397.     FRAMEWIN_Obj* pObj = FRAMEWIN_H2P(hObj);
  398.     NeedsInvalidate = 1;
  399.     if (s && pObj->pText) {
  400.       if (strcmp(s, pObj->pText) == 0) {
  401.         NeedsInvalidate = 0;
  402.       }
  403.     }
  404.     pObj->pText = s;
  405.     if (NeedsInvalidate) {
  406.       FRAMEWIN_Invalidate(hObj);
  407.     }
  408.   }
  409.   GUI_UNLOCK();
  410. }
  411. void FRAMEWIN_SetTextAlign(FRAMEWIN_Handle hObj, int Align) {
  412.   GUI_LOCK();
  413.   if (hObj) {
  414.     FRAMEWIN_Obj* pObj = FRAMEWIN_H2P(hObj);
  415.     pObj->TextAlign = Align;
  416.     switch (Align) {
  417.     case GUI_TA_HCENTER:
  418.       pObj->XOff = (pObj->rClient.x1 - pObj->rClient.x0) / 2;
  419.       break;
  420.     case GUI_TA_LEFT:
  421.       pObj->XOff = pObj->FrameSize;
  422.       break;
  423.     case GUI_TA_RIGHT:
  424.       pObj->XOff = pObj->rClient.x1 - pObj->FrameSize;
  425.       break;
  426.     }
  427.     FRAMEWIN_Invalidate(hObj);
  428.   }
  429.   GUI_UNLOCK();
  430. }
  431. void FRAMEWIN_SetTextPos(FRAMEWIN_Handle hObj, int XOff, int YOff) {
  432.   GUI_LOCK();
  433.   if (hObj) {
  434.     FRAMEWIN_Obj* pObj = FRAMEWIN_H2P(hObj);
  435.     pObj->XOff = XOff;
  436.     pObj->YOff = YOff;
  437.     FRAMEWIN_Invalidate(hObj);
  438.   }
  439.   GUI_UNLOCK();
  440. }
  441. void FRAMEWIN_SetActive(FRAMEWIN_Handle hObj, int State) {
  442.   GUI_LOCK();
  443.   if (hObj) {
  444.     if (State) {
  445.       FRAMEWIN_SetBarColor(hObj, 0, FRAMEWIN_BARCOLOR_ACTIVE_DEFAULT);
  446.     } else {
  447.       FRAMEWIN_SetBarColor(hObj, 0, FRAMEWIN_BARCOLOR_INACTIVE_DEFAULT);
  448.     }
  449.   }
  450.   GUI_UNLOCK();
  451. }
  452. void FRAMEWIN_SetClientColor(FRAMEWIN_Handle hObj, GUI_COLOR Color) {
  453.   GUI_LOCK();
  454.   if (hObj) {
  455.     FRAMEWIN_Obj* pObj = FRAMEWIN_H2P(hObj);
  456.     pObj->ClientColor = Color;
  457.     FRAMEWIN_Invalidate(hObj);
  458.   }
  459.   GUI_UNLOCK();
  460. }
  461.   /***************************************************************
  462.   *
  463.   *                Set/Get defaults
  464.   *
  465.   ***************************************************************/
  466. void FRAMEWIN_SetDefaultFont(const GUI_FONT* pFont) {
  467.   _pDefaultFont = pFont;
  468. }
  469. const GUI_FONT* FRAMEWIN_GetDefaultFont(void) {
  470.   return _pDefaultFont;
  471. }
  472. void FRAMEWIN_SetDefaultBarColor(int Index, GUI_COLOR Color) {
  473.   if ((Index >= 0) && (Index <= 1)) {
  474.     _aBarColor[Index] = Color;
  475.   }
  476. }
  477. GUI_COLOR FRAMEWIN_GetDefaultBarColor(int Index) {
  478.   GUI_COLOR r = 0;
  479.   if ((Index >= 0) && (Index <= 1)) {
  480.     r = _aBarColor[Index];
  481.   }
  482.   return r;
  483. }
  484. void FRAMEWIN_SetDefaultClientColor(GUI_COLOR Color) {
  485.   _DefaultClientColor = Color;
  486. }
  487. GUI_COLOR FRAMEWIN_GetDefaultClientColor(void) {
  488.   return _DefaultClientColor;
  489. }
  490. int FRAMEWIN_GetDefaultCaptionSize(void) {
  491.   return _DefaultCaptionSize;
  492. }
  493. void FRAMEWIN_SetDefaultCaptionSize(int DefaultCaptionSize) {
  494.   _DefaultCaptionSize = DefaultCaptionSize;
  495. }
  496. int FRAMEWIN_GetDefaultBorderSize(void) {
  497.   return _DefaultBorderSize;
  498. }
  499. void FRAMEWIN_SetDefaultBorderSize(int DefaultBorderSize) {
  500.   _DefaultBorderSize = DefaultBorderSize;
  501. }
  502. #else
  503.   void WIDGET_FrameWin(void) {} /* avoid empty object files */
  504. #endif /* GUI_WINSUPPORT */