13 #include "../../gfx.h"
15 #if GFX_USE_GWIN && GWIN_NEED_WIDGET
19 #include "gwin_class.h"
24 #if (GFX_USE_GINPUT && GINPUT_NEED_KEYBOARD) || GWIN_NEED_KEYBOARD
92 #define gw ((GWidgetObject *)gh)
93 #define wvmt ((gwidgetVMT *)gh->vmt)
96 static void gwidgetEvent(
void *param, GEvent *pe) {
97 #define pme ((GEventMouse *)pe)
98 #define pke ((GEventKeyboard *)pe)
99 #define pte ((GEventToggle *)pe)
100 #define pde ((GEventDial *)pe)
103 #if GINPUT_NEED_MOUSE
106 #if GINPUT_NEED_MOUSE || GINPUT_NEED_TOGGLE || GINPUT_NEED_DIAL || GINPUT_NEED_KEYBOARD
109 #if GINPUT_NEED_TOGGLE || GINPUT_NEED_DIAL
119 #if GFX_USE_GINPUT && GINPUT_NEED_MOUSE
126 if (h->
display != pme->display || !(h->
flags & GWIN_FLG_SYSVISIBLE))
130 if ((h->
flags & (GWIN_FLG_WIDGET|GWIN_FLG_MOUSECAPTURE)) == (GWIN_FLG_WIDGET|GWIN_FLG_MOUSECAPTURE)) {
132 if ((pme->buttons & GMETA_MOUSE_UP)) {
133 gh->
flags &= ~GWIN_FLG_MOUSECAPTURE;
135 wvmt->MouseUp(gw, pme->x - gh->
x, pme->y - gh->
y);
136 }
else if (wvmt->MouseMove)
137 wvmt->MouseMove(gw, pme->x - gh->
x, pme->y - gh->
y);
146 if (pme->x >= h->
x && pme->x < h->
x + h->
width && pme->y >= h->
y && pme->y < h->
y + h->
height)
151 if (gh && (gh->
flags & (GWIN_FLG_WIDGET|GWIN_FLG_SYSENABLED)) == (GWIN_FLG_WIDGET|GWIN_FLG_SYSENABLED)) {
152 if ((pme->buttons & GMETA_MOUSE_DOWN)) {
153 gh->
flags |= GWIN_FLG_MOUSECAPTURE;
155 #if (GFX_USE_GINPUT && GINPUT_NEED_KEYBOARD) || GWIN_NEED_KEYBOARD
162 wvmt->MouseDown(gw, pme->x - gh->
x, pme->y - gh->
y);
168 #if (GFX_USE_GINPUT && GINPUT_NEED_KEYBOARD) || GWIN_NEED_KEYBOARD
169 case GEVENT_KEYBOARD:
171 if (pke->bytecount == 1 && pke->c[0] == GKEY_TAB) {
172 if (!(pke->keystate & GKEYSTATE_KEYUP))
183 #if GFX_USE_GINPUT && GINPUT_NEED_TOGGLE
189 if ((gh->
flags & (GWIN_FLG_WIDGET|GWIN_FLG_SYSENABLED|GWIN_FLG_SYSVISIBLE)) != (GWIN_FLG_WIDGET|GWIN_FLG_SYSENABLED|GWIN_FLG_SYSVISIBLE))
192 for(role = 0; role < wvmt->toggleroles; role++) {
193 if (wvmt->ToggleGet(gw, role) == pte->instance) {
196 wvmt->ToggleOn(gw, role);
199 wvmt->ToggleOff(gw, role);
207 #if GFX_USE_GINPUT && GINPUT_NEED_DIAL
213 if ((gh->
flags & (GWIN_FLG_WIDGET|GWIN_FLG_SYSENABLED|GWIN_FLG_SYSVISIBLE)) != (GWIN_FLG_WIDGET|GWIN_FLG_SYSENABLED|GWIN_FLG_SYSVISIBLE))
216 for(role = 0; role < wvmt->dialroles; role++) {
217 if (wvmt->DialGet(gw, role) == pte->instance) {
219 wvmt->DialMove(gw, role, pde->value, pde->maxvalue);
236 #if (GFX_USE_GINPUT && GINPUT_NEED_KEYBOARD) || GWIN_NEED_KEYBOARD
238 return _widgetInFocus;
245 if (gh == _widgetInFocus)
249 if (!gh || ((gh->
flags & (GWIN_FLG_WIDGET|GWIN_FLG_ENABLED|GWIN_FLG_SYSENABLED|GWIN_FLG_VISIBLE|GWIN_FLG_SYSVISIBLE)) == (GWIN_FLG_WIDGET|GWIN_FLG_ENABLED|GWIN_FLG_SYSENABLED|GWIN_FLG_VISIBLE|GWIN_FLG_SYSVISIBLE)
252 oldFocus = _widgetInFocus;
254 if (oldFocus) _gwinUpdate(oldFocus);
255 if (gh) _gwinUpdate(gh);
261 void _gwinMoveFocus(
void) {
268 if (!gh && !looponce) {
277 void _gwinFixFocus(
GHandle gh) {
280 if ((gh->
flags & (GWIN_FLG_WIDGET|GWIN_FLG_ENABLED|GWIN_FLG_SYSENABLED|GWIN_FLG_VISIBLE|GWIN_FLG_SYSVISIBLE)) == (GWIN_FLG_WIDGET|GWIN_FLG_ENABLED|GWIN_FLG_SYSENABLED|GWIN_FLG_VISIBLE|GWIN_FLG_SYSVISIBLE)
295 if (gh != _widgetInFocus)
299 oldFocus = _widgetInFocus;
303 if ((gh->
flags & (GWIN_FLG_WIDGET|GWIN_FLG_ENABLED|GWIN_FLG_SYSENABLED|GWIN_FLG_VISIBLE|GWIN_FLG_SYSVISIBLE)) == (GWIN_FLG_WIDGET|GWIN_FLG_ENABLED|GWIN_FLG_SYSENABLED|GWIN_FLG_VISIBLE|GWIN_FLG_SYSVISIBLE)
310 gh->
flags |= GWIN_FLG_NEEDREDRAW;
324 if (&gx->
g != _widgetInFocus)
333 #if GDISP_NEED_CIRCLE
338 if (&gx->
g != _widgetInFocus)
348 #if GFX_USE_GINPUT && GINPUT_NEED_TOGGLE
349 static GHandle FindToggleUser(gU16 instance) {
354 if (!(gh->
flags & GWIN_FLG_WIDGET))
357 for(role = 0; role < wvmt->toggleroles; role++) {
358 if (wvmt->ToggleGet(gw, role) == instance)
366 #if GFX_USE_GINPUT && GINPUT_NEED_DIAL
367 static GHandle FindDialUser(gU16 instance) {
372 if (!(gh->
flags & GWIN_FLG_WIDGET))
375 for(role = 0; role < wvmt->dialroles; role++) {
376 if (wvmt->DialGet(gw, role) == instance)
384 void _gwidgetInit(
void)
387 geventRegisterCallback(&gl, gwidgetEvent, 0);
388 #if GINPUT_NEED_MOUSE
391 #if GINPUT_NEED_KEYBOARD || GWIN_NEED_KEYBOARD
396 void _gwidgetDeinit(
void)
402 if (!(pgw = (
GWidgetObject *)_gwindowCreate(g, &pgw->
g, &pInit->
g, &vmt->
g, GWIN_FLG_WIDGET|GWIN_FLG_ENABLED|GWIN_FLG_SYSENABLED)))
405 #if GWIN_NEED_CONTAINERS
407 if (pgw->
g.parent && !(pgw->
g.parent->
flags & GWIN_FLG_SYSENABLED))
408 pgw->
g.
flags &= ~GWIN_FLG_SYSENABLED;
421 void _gwidgetDestroy(
GHandle gh) {
422 #if GFX_USE_GINPUT && (GINPUT_NEED_TOGGLE || GINPUT_NEED_DIAL)
427 gh->
flags &= ~GWIN_FLG_VISIBLE;
431 if ((gh->
flags & GWIN_FLG_ALLOCTXT)) {
432 gh->
flags &= ~GWIN_FLG_ALLOCTXT;
436 #if GFX_USE_GINPUT && GINPUT_NEED_TOGGLE
438 for(role = 0; role < wvmt->toggleroles; role++) {
439 instance = wvmt->ToggleGet(gw, role);
440 if (instance != GWIDGET_NO_INSTANCE) {
441 wvmt->ToggleAssign(gw, role, GWIDGET_NO_INSTANCE);
442 if (!FindToggleUser(instance))
448 #if GFX_USE_GINPUT && GINPUT_NEED_DIAL
450 for(role = 0; role < wvmt->dialroles; role++) {
451 instance = wvmt->DialGet(gw, role);
452 if (instance != GWIDGET_NO_INSTANCE) {
453 wvmt->DialAssign(gw, role, GWIDGET_NO_INSTANCE);
454 if (!FindDialUser(instance))
464 void _gwidgetRedraw(
GHandle gh) {
465 if (!(gh->
flags & GWIN_FLG_SYSVISIBLE))
468 gw->fnDraw(gw, gw->fnParam);
471 void _gwinSendEvent(
GHandle gh, GEventType type) {
472 GSourceListener * psl;
493 for(p = (
char *)pwi, len =
sizeof(
GWidgetInit); len; len--)
512 defaultStyle = pstyle;
525 if (!(gh->
flags & GWIN_FLG_WIDGET))
529 if ((gh->
flags & GWIN_FLG_ALLOCTXT)) {
530 gh->
flags &= ~GWIN_FLG_ALLOCTXT;
543 if ((str =
gfxAlloc(strlen(text)+1))) {
544 gh->
flags |= GWIN_FLG_ALLOCTXT;
547 gw->text = (
const char *)str;
553 #if GFX_USE_GFILE && GFILE_NEED_PRINTG && GFILE_NEED_STRINGS
561 if (!(gh->
flags & GWIN_FLG_WIDGET))
565 if ((gh->
flags & GWIN_FLG_ALLOCTXT)) {
566 gh->
flags &= ~GWIN_FLG_ALLOCTXT;
576 size = vsnprintg(0, 0, fmt, va) + 1;
579 gh->
flags |= GWIN_FLG_ALLOCTXT;
580 vsnprintg(str, size, fmt, va);
581 gw->text = (
const char *)str;
592 if (!(gh->
flags & GWIN_FLG_WIDGET))
599 if (gh->
flags & GWIN_FLG_WIDGET) {
607 if (!(gh->
flags & GWIN_FLG_WIDGET))
610 gw->pstyle = pstyle ? pstyle : defaultStyle;
611 gh->
bgcolor = gw->pstyle->background;
612 gh->
color = gw->pstyle->enabled.text;
618 if (!(gh->
flags & GWIN_FLG_WIDGET))
625 if (!(gh->
flags & GWIN_FLG_WIDGET))
628 gw->fnDraw = fn ? fn : wvmt->DefaultDraw;
637 #if GFX_USE_GINPUT && GINPUT_NEED_MOUSE
638 gBool
DEPRECATED(
"This call can now be removed. Attaching the mouse to GWIN is now automatic.") gwinAttachMouse(gU16 instance) {
645 #if GFX_USE_GINPUT && GINPUT_NEED_TOGGLE
651 if (!(gh->
flags & GWIN_FLG_WIDGET))
655 if (role >= wvmt->toggleroles)
663 oi = wvmt->ToggleGet(gw, role);
668 if (oi != GWIDGET_NO_INSTANCE) {
669 wvmt->ToggleAssign(gw, role, GWIDGET_NO_INSTANCE);
670 if (!FindToggleUser(oi))
675 wvmt->ToggleAssign(gw, role, instance);
683 if (!(gh->
flags & GWIN_FLG_WIDGET))
693 if (oi != GWIDGET_NO_INSTANCE) {
694 ((
gwidgetVMT *)gh->
vmt)->ToggleAssign(gw, role, GWIDGET_NO_INSTANCE);
695 if (!FindToggleUser(oi))
703 #if GFX_USE_GINPUT && GINPUT_NEED_DIAL
708 if (!(gh->
flags & GWIN_FLG_WIDGET))
712 if (role >= wvmt->dialroles)
720 oi = wvmt->DialGet(gw, role);
725 if (oi != GWIDGET_NO_INSTANCE) {
726 wvmt->DialAssign(gw, role, GWIDGET_NO_INSTANCE);
727 if (!FindDialUser(oi))
732 wvmt->DialAssign(gw, role, instance);
739 if ((gh->
flags & GWIN_FLG_WIDGET))
744 return ((gh->
flags & GWIN_FLG_WIDGET)) ? gw->tag : 0;
#define HTML2COLOR(h)
Convert a 6 digit HTML code (hex) into a color value.
GSourceHandle ginputGetDial(gU16 instance)
Create a dial input instance.
void gdispGDrawCircle(GDisplay *g, gCoord x, gCoord y, gCoord radius, gColor color)
Draw a circle.
gI16 gCoord
The type for a coordinate or length on the screen.
void gdispGDrawBox(GDisplay *g, gCoord x, gCoord y, gCoord cx, gCoord cy, gColor color)
Draw a rectangular box.
void geventListenerInit(GListener *pl)
Create a Listener.
GEvent * geventGetEventBuffer(GSourceListener *psl)
Get the event buffer from the GSourceListener.
void geventDetachSource(GListener *pl, GSourceHandle gsh)
Detach a source from a listener.
void geventSendEvent(GSourceListener *psl)
Called by a source to indicate the listener's event buffer has been filled.
gBool geventAttachSource(GListener *pl, GSourceHandle gsh, gU32 flags)
Attach a source to a listener.
GSourceListener * geventGetSourceListener(GSourceHandle gsh, GSourceListener *lastlr)
Called by a source with a possible event to get a listener record.
void geventDetachSourceListeners(GSourceHandle gsh)
Detach any listener that has this source attached.
#define DEPRECATED(msg)
Mark a function as deprecated.
void * gfxAlloc(gMemSize sz)
Allocate memory.
void gfxFree(void *ptr)
Free memory.
#define GWIN_FOCUS_HIGHLIGHT_WIDTH
The width of the rectangle that highlights a widget that is focused.
GSourceHandle ginputGetKeyboard(unsigned instance)
Create a keyboard input instance.
GSourceHandle ginputGetMouse(unsigned instance)
Get the Source handler for a mouse using the instance number.
GSourceHandle ginputGetToggle(gU16 instance)
Create a toggle input instance.
void gwinRedraw(GHandle gh)
Redraw a window.
GHandle gwinGetNextWindow(GHandle gh)
Get the next window in the z-order.
void gwinSetDefaultBgColor(gColor bgclr)
Set the default background color for all new GWIN windows.
A window object structure.
const struct gwinVMT * vmt