13 #include "../../gfx.h" 
   15 #if GFX_USE_GWIN && GWIN_NEED_FRAME 
   17 #include "gwin_class.h" 
   20 #define FRM_BUTTON_X    18                   
   21 #define FRM_BUTTON_Y    18                   
   22 #define FRM_BUTTON_I    3                    
   23 #define FRM_BUTTON_T    2                    
   24 #define FRM_BUTTON_B    2                    
   25 #define FRM_BORDER_L    2                    
   26 #define FRM_BORDER_R    2                    
   27 #define FRM_BORDER_T    (FRM_BUTTON_Y+FRM_BUTTON_T+FRM_BUTTON_B)     
   28 #define FRM_BORDER_B    2                    
   31 #define GWIN_FRAME_USER_FLAGS       (GWIN_FRAME_CLOSE_BTN|GWIN_FRAME_MINMAX_BTN|GWIN_FRAME_KEEPONCLOSE) 
   33 #if GWIN_FRAME_CLOSE_BTN < GWIN_FIRST_CONTROL_FLAG 
   34     #error "GWIN Frame: - Flag definitions don't match" 
   36 #if GWIN_FRAME_REDRAW_FRAME > GWIN_LAST_CONTROL_FLAG 
   37     #error "GWIN Frame: - Flag definitions don't match" 
   40 static gCoord FrameBorderSizeL(
GHandle gh)  { (void)gh; 
return FRM_BORDER_L; }
 
   41 static gCoord FrameBorderSizeR(
GHandle gh)  { (void)gh; 
return FRM_BORDER_R; }
 
   42 static gCoord FrameBorderSizeT(
GHandle gh)  { (void)gh; 
return FRM_BORDER_T; }
 
   43 static gCoord FrameBorderSizeB(
GHandle gh)  { (void)gh; 
return FRM_BORDER_B; }
 
   48     gw->
g.
flags |= GWIN_FRAME_REDRAW_FRAME;
 
   50     gw->
g.
flags &= ~GWIN_FRAME_REDRAW_FRAME;
 
   58         if (y < FRM_BUTTON_T || y >= FRM_BUTTON_T+FRM_BUTTON_Y)
 
   61         pos = gw->
g.
width - (FRM_BORDER_R+FRM_BUTTON_X);
 
   63             if (x >= pos && x < pos+FRM_BUTTON_X) {
 
   72             if (x >= pos && x < pos+FRM_BUTTON_X) {
 
   74                 gw->
g.
flags |= GWIN_FRAME_MAX_PRESSED;
 
   79             if (x >= pos && x < pos+FRM_BUTTON_X) {
 
   81                 gw->
g.
flags |= GWIN_FRAME_MIN_PRESSED;
 
   90         #if GWIN_BUTTON_LAZY_RELEASE 
   95                 _gwinSendEvent(&gw->
g, GEVENT_GWIN_CLOSE);
 
   97                     _gwinDestroy(&gw->
g, REDRAW_INSESSION);
 
  100             if ((gw->
g.
flags & GWIN_FRAME_MAX_PRESSED)) {
 
  103                 forceFrameRedraw(gw);
 
  107             if ((gw->
g.
flags & GWIN_FRAME_MIN_PRESSED)) {
 
  110                 forceFrameRedraw(gw);
 
  120             if (y >= FRM_BUTTON_T && y < FRM_BUTTON_T+FRM_BUTTON_Y) {
 
  123                 pos = gw->
g.
width - (FRM_BORDER_R+FRM_BUTTON_X);
 
  128                         forceFrameRedraw(gw);
 
  129                         _gwinSendEvent(&gw->
g, GEVENT_GWIN_CLOSE);
 
  131                             _gwinDestroy(&gw->
g, REDRAW_INSESSION);
 
  137                     if ((gw->
g.
flags & GWIN_FRAME_MAX_PRESSED) && x >= pos && x <= pos+FRM_BUTTON_X) {
 
  140                         forceFrameRedraw(gw);
 
  145                     if ((gw->
g.
flags & GWIN_FRAME_MIN_PRESSED) && x >= pos && x <= pos+FRM_BUTTON_X) {
 
  148                         forceFrameRedraw(gw);
 
  158             forceFrameRedraw(gw);
 
  173         #if GINPUT_NEED_MOUSE 
  180         #if GINPUT_NEED_KEYBOARD || GWIN_NEED_KEYBOARD 
  185         #if GINPUT_NEED_TOGGLE 
  216     flags &= GWIN_FRAME_USER_FLAGS;
 
  251     pos = gw->
g.
x+gw->
g.
width - (FRM_BORDER_R+FRM_BUTTON_X);
 
  255             gdispFillArea(pos, gw->
g.
y+FRM_BUTTON_T, FRM_BUTTON_X, FRM_BUTTON_Y, btn);
 
  256         gdispDrawLine(pos+FRM_BUTTON_I, gw->
g.
y+(FRM_BUTTON_T+FRM_BUTTON_I), pos+(FRM_BUTTON_X-FRM_BUTTON_I-1), gw->
g.
y+(FRM_BUTTON_T+FRM_BUTTON_Y-FRM_BUTTON_I-1), contrast);
 
  257         gdispDrawLine(pos+(FRM_BUTTON_X-FRM_BUTTON_I-1), gw->
g.
y+(FRM_BUTTON_T+FRM_BUTTON_I), pos+FRM_BUTTON_I, gw->
g.
y+(FRM_BUTTON_T+FRM_BUTTON_Y-FRM_BUTTON_I-1), contrast);
 
  262         if ((gw->
g.
flags & GWIN_FRAME_MAX_PRESSED))
 
  263             gdispFillArea(pos, gw->
g.
y+FRM_BUTTON_T, FRM_BUTTON_X, FRM_BUTTON_Y, btn);
 
  265         gdispDrawBox(pos+FRM_BUTTON_I, gw->
g.
y+(FRM_BUTTON_T+FRM_BUTTON_I), FRM_BUTTON_X-2*FRM_BUTTON_I, FRM_BUTTON_Y-2*FRM_BUTTON_I, contrast);
 
  266         gdispDrawLine(pos+(FRM_BUTTON_I+1), gw->
g.
y+(FRM_BUTTON_T+FRM_BUTTON_I+1), pos+(FRM_BUTTON_X-FRM_BUTTON_I-2), gw->
g.
y+(FRM_BUTTON_T+FRM_BUTTON_I+1), contrast);
 
  267         gdispDrawLine(pos+(FRM_BUTTON_I+1), gw->
g.
y+(FRM_BUTTON_T+FRM_BUTTON_I+2), pos+(FRM_BUTTON_X-FRM_BUTTON_I-2), gw->
g.
y+(FRM_BUTTON_T+FRM_BUTTON_I+2), contrast);
 
  269         if ((gw->
g.
flags & GWIN_FRAME_MIN_PRESSED))
 
  270             gdispFillArea(pos, gw->
g.
y+FRM_BUTTON_T, FRM_BUTTON_X, FRM_BUTTON_Y, btn);
 
  271         gdispDrawLine(pos+FRM_BUTTON_I, gw->
g.
y+(FRM_BUTTON_T+FRM_BUTTON_Y-FRM_BUTTON_I-1), pos+(FRM_BUTTON_X-FRM_BUTTON_I-1), gw->
g.
y+(FRM_BUTTON_T+FRM_BUTTON_Y-FRM_BUTTON_I-1), contrast);
 
  288     if ((gw->
g.
flags & GWIN_FRAME_REDRAW_FRAME))
 
  297         #define gi          ((gImage *)param) 
  298         gCoord              x, y, iw, ih, mx, my;
 
  307         if ((gw->
g.
flags & GWIN_FRAME_REDRAW_FRAME))
 
  311         mx = gw->
g.
x+gw->
g.
width - FRM_BORDER_R;
 
  312         my = gw->
g.
y+gw->
g.
height - FRM_BORDER_B;
 
  313         for(y = gw->
g.
y+FRM_BORDER_T, ih = gi->height; y < my; y += ih) {
 
  316             for(x = gw->
g.
x+FRM_BORDER_L, iw = gi->width; x < mx; x += iw) {
 
COLOR_TYPE gColor
The color type definition.
 
#define GWIN_FRAME_CLOSE_PRESSED
The internal frame flags.
 
GHandle gwinGFrameCreate(GDisplay *g, GFrameObject *fo, GWidgetInit *pInit, gU32 flags)
Create a frame widget.
 
#define GWIN_FRAME_CLOSE_BTN
 
#define GWIN_FRAME_MINMAX_BTN
 
#define GWIN_FRAME_KEEPONCLOSE
 
gColor gdispBlendColor(gColor fg, gColor bg, gU8 alpha)
Blend 2 colors according to the alpha.
 
gColor gdispContrastColor(gColor color)
Find a contrasting color.
 
void gdispGFillArea(GDisplay *g, gCoord x, gCoord y, gCoord cx, gCoord cy, gColor color)
Fill an area with a color.
 
void gdispGFillStringBox(GDisplay *g, gCoord x, gCoord y, gCoord cx, gCoord cy, const char *str, gFont font, gColor color, gColor bgColor, gJustify justify)
Draw a text string vertically centered within the specified box. The box background is filled with th...
 
gI16 gCoord
The type for a coordinate or length on the screen.
 
gdispImageError gdispGImageDraw(GDisplay *g, gImage *img, gCoord x, gCoord y, gCoord cx, gCoord cy, gCoord sx, gCoord sy)
Draw the image.
 
void gwinFrameDraw_Std(GWidgetObject *gw, void *param)
The default rendering function for the frame widget.
 
void gwinFrameDraw_Transparent(GWidgetObject *gw, void *param)
Renders the frame widget with a transparent client area.
 
void gwinFrameDraw_Image(GWidgetObject *gw, void *param)
Renders the frame widget and uses the specified image for the client area.
 
void gwinSetVisible(GHandle gh, gBool visible)
Sets whether a window is visible or not.
 
void gwinSetMinMax(GHandle gh, GWindowMinMax minmax)
Minimize, Maximize or Restore a window.
 
A window object structure.
 
const struct gwinVMT * vmt
 
The Virtual Method Table for a container.
 
The Virtual Method Table for a GWIN window.