X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Faxwin3_src%2FWM%2Frenderers%2Fwidget.c;h=88529543c92d18e16cc1481f74351b4449ad2603;hb=507f19941f45bca7c1de783a394f56b15f10be4d;hp=586a5069491a859b416c09519e647b8b6b886b5c;hpb=94478ae8163d1ce92ed54550f03e76bb9f2e1802;p=tpg%2Facess2.git diff --git a/Usermode/Applications/axwin3_src/WM/renderers/widget.c b/Usermode/Applications/axwin3_src/WM/renderers/widget.c index 586a5069..88529543 100644 --- a/Usermode/Applications/axwin3_src/WM/renderers/widget.c +++ b/Usermode/Applications/axwin3_src/WM/renderers/widget.c @@ -392,7 +392,7 @@ tElement *Widget_GetElementByPos(tWidgetWin *Info, int X, int Y) tElement *ret, *next, *ele; next = &Info->RootElement; - while(next) + do { ret = next; next = NULL; @@ -405,7 +405,7 @@ tElement *Widget_GetElementByPos(tWidgetWin *Info, int X, int Y) if(Y >= ele->CachedY + ele->CachedH) continue; next = ele; } - } + } while(next); return ret; } @@ -423,11 +423,52 @@ tElement *Widget_GetElementById(tWidgetWin *Info, uint32_t ID) return ele; } +tElement *Widget_int_Create(tWidgetWin *Info, tElement *Parent, int ID, int Type, int Flags) +{ + if( Widget_GetElementById(Info, ID) ) + return NULL; + + // Create new element + tElement *new = calloc(sizeof(tElement), 1); + new->Window = Parent->Window; + new->ID = ID; + new->Type = Type; + new->Parent = Parent; + new->Flags = Flags; + new->PaddingT = 2; + new->PaddingB = 2; + new->PaddingL = 2; + new->PaddingR = 2; + new->CachedX = -1; + + if( gaWM_WidgetTypes[Type]->Init ) + gaWM_WidgetTypes[Type]->Init(new); + + // Add to parent's list + if(Parent->LastChild) + Parent->LastChild->NextSibling = new; + else + Parent->FirstChild = new; + Parent->LastChild = new; + + // Add to info + { + tElement *ele, *prev = NULL; + for(ele = Info->ElementTable[new->ID % Info->TableSize]; ele; prev = ele, ele = ele->ListNext); + if(prev) + prev->ListNext = new; + else + Info->ElementTable[new->ID % Info->TableSize] = new; + } + + return new; +} + // --- Message Handlers --- void Widget_NewWidget(tWidgetWin *Info, size_t Len, const tWidgetMsg_Create *Msg) { const int max_debugname_len = Len - sizeof(tWidgetMsg_Create); - tElement *parent, *new; + tElement *parent; // Sanity check if( Len < sizeof(*Msg) ) @@ -452,43 +493,28 @@ void Widget_NewWidget(tWidgetWin *Info, size_t Len, const tWidgetMsg_Create *Msg return ; } - // Check if the ID is already in use - if( Widget_GetElementById(Info, Msg->NewID) ) - return ; + Widget_int_Create(Info, parent, Msg->NewID, Msg->Type, Msg->Flags); - // Create new element - new = calloc(sizeof(tElement), 1); - new->Window = parent->Window; - new->ID = Msg->NewID; - new->Type = Msg->Type; - new->Parent = parent; - new->Flags = Msg->Flags; - new->PaddingT = 2; - new->PaddingB = 2; - new->PaddingL = 2; - new->PaddingR = 2; - new->CachedX = -1; - - if( gaWM_WidgetTypes[new->Type]->Init ) - gaWM_WidgetTypes[new->Type]->Init(new); - - // Add to parent's list - if(parent->LastChild) - parent->LastChild->NextSibling = new; - else - parent->FirstChild = new; - parent->LastChild = new; + Widget_UpdateMinDims(parent); +} - // Add to info - { - tElement *ele, *prev = NULL; - for(ele = Info->ElementTable[new->ID % Info->TableSize]; ele; prev = ele, ele = ele->ListNext); - if(prev) - prev->ListNext = new; - else - Info->ElementTable[new->ID % Info->TableSize] = new; - } +void Widget_NewWidgetSubwin(tWidgetWin *Info, size_t Len, const tWidgetMsg_CreateSubWin *Msg) +{ + const int max_debugname_len = Len - sizeof(tWidgetMsg_CreateSubWin); + tElement *parent, *new; + // Sanity check + if( Len < sizeof(*Msg) ) + return ; + if( strnlen(Msg->DebugName, max_debugname_len) == max_debugname_len ) + return ; + + parent = Widget_GetElementById(Info, Msg->Parent); + if(!parent) return; + if( Widget_GetElementById(Info, Msg->NewID) ) return ; + + new = Widget_int_Create(Info, parent, Msg->NewID, Msg->Type, Msg->Flags); + new->Data = WM_GetWindowByID(parent->Window, Msg->WindowHandle); Widget_UpdateMinDims(parent); } @@ -552,6 +578,34 @@ void Widget_SetText(tWidgetWin *Info, int Len, const tWidgetMsg_SetText *Msg) // } } +int Widget_GetText(tWidgetWin *Info, int Len, const tWidgetMsg_SetText *Msg) +{ + if( Len < sizeof(*Msg) ) + return 0; + if( Len > sizeof(*Msg) ) + return 1; // Pass to user + + const char *text = NULL; + tElement *ele = Widget_GetElementById(Info, Msg->WidgetID); + if(ele) + text = ele->Text; + + char buf[sizeof(tWidgetMsg_SetText) + strlen(text?text:"") + 1]; + tWidgetMsg_SetText *omsg = (void*)buf; + + if( text ) { + omsg->WidgetID = Msg->WidgetID; + strcpy(omsg->Text, text); + } + else { + omsg->WidgetID = -1; + omsg->Text[0] = 0; + } + + WM_SendMessage(Info->RootElement.Window, Info->RootElement.Window, MSG_WIDGET_GETTEXT, sizeof(buf), buf); + return 0; +} + int Renderer_Widget_HandleMessage(tWindow *Target, int Msg, int Len, const void *Data) { tWidgetWin *info = Target->RendererInfo; @@ -661,6 +715,9 @@ int Renderer_Widget_HandleMessage(tWindow *Target, int Msg, int Len, const void case MSG_WIDGET_CREATE: Widget_NewWidget(info, Len, Data); return 0; + case MSG_WIDGET_CREATESUBWIN: + Widget_NewWidgetSubwin(info, Len, Data); + return 0; // Delete a widget case MSG_WIDGET_DELETE: @@ -691,6 +748,8 @@ int Renderer_Widget_HandleMessage(tWindow *Target, int Msg, int Len, const void case MSG_WIDGET_SETTEXT: Widget_SetText(info, Len, Data); return 0; + case MSG_WIDGET_GETTEXT: + return Widget_GetText(info, Len, Data); // default: