X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Faxwin3_src%2Flibaxwin3.so_src%2Fr_widget.c;h=c050e90c73886add31cacdcd3659d788a4359e88;hb=507f19941f45bca7c1de783a394f56b15f10be4d;hp=43eef70dacdc1585dea37b01a81486a2b95c3af5;hpb=d2e9501431148e85345cefe6315f0eace0dfd777;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 43eef70d..c050e90c 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 @@ -46,6 +46,33 @@ tAxWin3_Widget *AxWin3_Widget_int_GetElementByID(tHWND Window, uint32_t ID) return info->Elements[ID]; } +uint32_t AxWin3_Widget_int_AllocateID(tWidgetWindowInfo *Info) +{ + uint32_t newID; + // BUG BUG BUG - Double Allocations! (citation needed) + // TODO: Atomicity + for( newID = Info->FirstFreeID; newID < Info->nElements; newID ++ ) + { + if( Info->Elements[newID] == NULL ) + break; + } + if( newID == Info->nElements ) + { + const int size_step = 4; + Info->nElements += 4; + Info->Elements = realloc(Info->Elements, sizeof(*Info->Elements)*Info->nElements); + 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; + + return newID; + +} + int AxWin3_Widget_MessageHandler(tHWND Window, int MessageID, int Size, void *Data) { tAxWin3_Widget *widget; @@ -108,26 +135,7 @@ tAxWin3_Widget *AxWin3_Widget_AddWidget(tAxWin3_Widget *Parent, int Type, int Fl info = AxWin3_int_GetDataPtr(Parent->Window); - // Assign ID - // BUG BUG BUG - Double Allocations! - // TODO: Atomicity - for( newID = info->FirstFreeID; newID < info->nElements; newID ++ ) - { - if( info->Elements[newID] == NULL ) - break; - } - if( newID == info->nElements ) - { - const int size_step = 4; - info->nElements += 4; - info->Elements = realloc(info->Elements, sizeof(*info->Elements)*info->nElements); - 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; + newID = AxWin3_Widget_int_AllocateID(info); // Create new widget structure ret = calloc(sizeof(tAxWin3_Widget), 1); @@ -151,6 +159,33 @@ tAxWin3_Widget *AxWin3_Widget_AddWidget(tAxWin3_Widget *Parent, int Type, int Fl return ret; } +tAxWin3_Widget *AxWin3_Widget_AddWidget_SubWindow(tAxWin3_Widget *Parent, tHWND Window, int Flags, const char *DbgName) +{ + tWidgetWindowInfo *info = AxWin3_int_GetDataPtr(Parent->Window); + int newID = AxWin3_Widget_int_AllocateID(info); + + tAxWin3_Widget *ret = calloc(sizeof(tAxWin3_Widget), 1); + ret->Window = Parent->Window; + ret->ID = newID; + info->Elements[newID] = ret; + + // Send message + { + char tmp[sizeof(tWidgetMsg_CreateSubWin)+1]; + tWidgetMsg_CreateSubWin *msg = (void*)tmp; + msg->Parent = Parent->ID; + msg->NewID = newID; + msg->Type = ELETYPE_SUBWIN; + msg->Flags = Flags; // TODO: Flags + msg->WindowHandle = AxWin3_int_GetWindowID(Window); + msg->DebugName[0] = '\0'; + AxWin3_SendMessage(ret->Window, ret->Window, MSG_WIDGET_CREATESUBWIN, sizeof(tmp), tmp); + } + + return ret; +} + + void AxWin3_Widget_DelWidget(tAxWin3_Widget *Widget) { tWidgetMsg_Delete msg; @@ -227,6 +262,27 @@ void AxWin3_Widget_SetText(tAxWin3_Widget *Widget, const char *Text) AxWin3_SendMessage(Widget->Window, Widget->Window, MSG_WIDGET_SETTEXT, sizeof(buf), buf); } +char *AxWin3_Widget_GetText(tAxWin3_Widget *Widget) +{ + char buf[sizeof(tWidgetMsg_SetText)]; + tWidgetMsg_SetText *msg = (void*)buf; + size_t retmsg_size; + + msg->WidgetID = Widget->ID; + + AxWin3_SendMessage(Widget->Window, Widget->Window, MSG_WIDGET_GETTEXT, sizeof(buf), buf); + + msg = AxWin3_WaitMessage(Widget->Window, MSG_WIDGET_GETTEXT, &retmsg_size); + if( retmsg_size < sizeof(*msg) ) { + free(msg); + return NULL; + } + + char *ret = strndup(msg->Text, retmsg_size - sizeof(*msg)); + free(msg); + return ret; +} + void AxWin3_Widget_SetColour(tAxWin3_Widget *Widget, int Index, tAxWin3_Colour Colour) { tWidgetMsg_SetColour msg;