X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Faxwin3_src%2Flibaxwin3.so_src%2Fr_widget.c;h=17dd16e9ec68f9e9675b1411bba3160abbc4ae1a;hb=7c00f2f9205aeb803f0499c9e88c98048830bea6;hp=6fa8adaf4355a87ca97540486cbb89eab7c8d228;hpb=82a4f841eafaff80b7dc258099abd865faaa0467;p=tpg%2Facess2.git diff --git a/Usermode/Applications/axwin3_src/libaxwin3.so_src/r_widget.c b/Usermode/Applications/axwin3_src/libaxwin3.so_src/r_widget.c index 6fa8adaf..17dd16e9 100644 --- a/Usermode/Applications/axwin3_src/libaxwin3.so_src/r_widget.c +++ b/Usermode/Applications/axwin3_src/libaxwin3.so_src/r_widget.c @@ -2,8 +2,8 @@ * AxWin3 Interface Library * - By John Hodge (thePowersGang) * - * main.c - * - Entrypoint and setup + * r_widget.c + * - Widget window type interface */ #include #include @@ -17,7 +17,12 @@ struct sAxWin3_Widget { tHWND Window; uint32_t ID; - tAxWin3_Widget_Callback Callback; + // Callbacks + tAxWin3_Widget_FireCb Fire; + tAxWin3_Widget_KeyUpDownCb KeyUpDown; + tAxWin3_Widget_KeyFireCb KeyFire; + tAxWin3_Widget_MouseMoveCb MouseMove; + tAxWin3_Widget_MouseBtnCb MouseButton; }; typedef struct @@ -30,9 +35,33 @@ typedef struct } tWidgetWindowInfo; // === CODE === -int AxWin3_Widget_MessageHandler(tHWND Window, int Size, void *Data) +tAxWin3_Widget *AxWin3_Widget_int_GetElementByID(tHWND Window, uint32_t ID) { - return 0; + tWidgetWindowInfo *info; + if(!Window) return NULL; + + info = AxWin3_int_GetDataPtr(Window); + if(ID >= info->nElements) return NULL; + + return info->Elements[ID]; +} + +int AxWin3_Widget_MessageHandler(tHWND Window, int MessageID, int Size, void *Data) +{ + tAxWin3_Widget *widget; + + switch(MessageID) + { + case MSG_WIDGET_FIRE: { + tWidgetMsg_Fire *msg = Data; + if(Size < sizeof(*msg)) return -1; + widget = AxWin3_Widget_int_GetElementByID(Window, msg->WidgetID); + if(widget->Fire) widget->Fire(widget); + + return 0; } + default: + return 0; + } } tHWND AxWin3_Widget_CreateWindow(tHWND Parent, int W, int H, int RootEleFlags) @@ -89,20 +118,21 @@ tAxWin3_Widget *AxWin3_Widget_AddWidget(tAxWin3_Widget *Parent, int Type, int Fl } if( newID == info->nElements ) { - info->nElements ++; + const int size_step = 4; + info->nElements += 4; info->Elements = realloc(info->Elements, sizeof(*info->Elements)*info->nElements); - newID = info->nElements - 1; - _SysDebug("Expanded and allocated %i", newID); + newID = info->nElements - 4; + memset( &info->Elements[newID+1], 0, (size_step-1)*sizeof(info->Elements)); + _SysDebug("Expanded to %i and allocated %i", info->nElements, newID); } else _SysDebug("Allocated %i", newID); info->Elements[newID] = (void*)-1; // Create new widget structure - ret = malloc(sizeof(tAxWin3_Widget)); + ret = calloc(sizeof(tAxWin3_Widget), 1); ret->Window = Parent->Window; ret->ID = newID; - ret->Callback = NULL; info->Elements[newID] = ret; @@ -135,6 +165,38 @@ void AxWin3_Widget_DelWidget(tAxWin3_Widget *Widget) free(Widget); } +// --- Callbacks +void AxWin3_Widget_SetFireHandler(tAxWin3_Widget *Widget, tAxWin3_Widget_FireCb Callback) +{ + if(!Widget) return; + Widget->Fire = Callback; +} + +void AxWin3_Widget_SetKeyHandler(tAxWin3_Widget *Widget, tAxWin3_Widget_KeyUpDownCb Callback) +{ + if(!Widget) return; + Widget->KeyUpDown = Callback; +} + +void AxWin3_Widget_SetKeyFireHandler(tAxWin3_Widget *Widget, tAxWin3_Widget_KeyFireCb Callback) +{ + if(!Widget) return; + Widget->KeyFire = Callback; +} + +void AxWin3_Widget_SetMouseMoveHandler(tAxWin3_Widget *Widget, tAxWin3_Widget_MouseMoveCb Callback) +{ + if(!Widget) return; + Widget->MouseMove = Callback; +} + +void AxWin3_Widget_SetMouseButtonHandler(tAxWin3_Widget *Widget, tAxWin3_Widget_MouseBtnCb Callback) +{ + if(!Widget) return; + Widget->MouseButton = Callback; +} + +// --- Manipulation void AxWin3_Widget_SetFlags(tAxWin3_Widget *Widget, int FlagSet, int FlagMask) { tWidgetMsg_SetFlags msg;