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.