X-Git-Url: https://git.ucc.asn.au/?a=blobdiff_plain;f=Usermode%2FApplications%2Faxwin3_src%2FWM%2Frenderers%2Fwidget.c;h=fd757af7a0fe2167b88bb018ae8c463df02d5f3c;hb=c658c88d73bcd7750fb7d727dfd9812d3d02c1bb;hp=49f1f6462baef8e092fbf84936b1127692bdfb75;hpb=f194730e75d6d3681e5f99a4efed1616fd1ea738;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 49f1f646..fd757af7 100644 --- a/Usermode/Applications/axwin3_src/WM/renderers/widget.c +++ b/Usermode/Applications/axwin3_src/WM/renderers/widget.c @@ -16,6 +16,14 @@ #define DEFAULT_ELETABLE_SIZE 64 #define BORDER_EVERYTHING 0 +// === IMPORTS === +extern tWidgetDef _widget_typedef_ELETYPE_IMAGE; +extern tWidgetDef _widget_typedef_ELETYPE_BUTTON; +extern tWidgetDef _widget_typedef_ELETYPE_TEXT; +extern tWidgetDef _widget_typedef_ELETYPE_TEXTINPUT; +extern tWidgetDef _widget_typedef_ELETYPE_SPACER; +extern tWidgetDef _widget_typedef_ELETYPE_SUBWIN; + // === PROTOTYPES === int Renderer_Widget_Init(void); tWindow *Renderer_Widget_Create(int Flags); @@ -56,17 +64,23 @@ tWMRenderer gRenderer_Widget = { }; // --- Element callbacks -tWidgetDef *gaWM_WidgetTypes[NUM_ELETYPES]; +tWidgetDef *gaWM_WidgetTypes[NUM_ELETYPES] = { + [ELETYPE_IMAGE] = &_widget_typedef_ELETYPE_IMAGE, + [ELETYPE_BUTTON] = &_widget_typedef_ELETYPE_BUTTON, + [ELETYPE_TEXT] = &_widget_typedef_ELETYPE_TEXT, + [ELETYPE_TEXTINPUT] = &_widget_typedef_ELETYPE_TEXTINPUT, + [ELETYPE_SPACER] = &_widget_typedef_ELETYPE_SPACER, + [ELETYPE_SUBWIN] = &_widget_typedef_ELETYPE_SUBWIN, + }; const int ciWM_NumWidgetTypes = sizeof(gaWM_WidgetTypes)/sizeof(gaWM_WidgetTypes[0]); tWidgetDef gWidget_NullWidgetDef; // === CODE === int Renderer_Widget_Init(void) { - int i; WM_RegisterRenderer(&gRenderer_Widget); - for(i = 0; i < ciWM_NumWidgetTypes; i ++) + for(int i = 0; i < ciWM_NumWidgetTypes; i ++) { if(gaWM_WidgetTypes[i] != NULL) continue; @@ -94,6 +108,7 @@ void Widget_int_SetTypeDef(int Type, tWidgetDef *Ptr) } gaWM_WidgetTypes[Type] = Ptr; + _SysDebug("Registered widget type %i '%s'", Type, Ptr->Name); } tWindow *Renderer_Widget_Create(int Flags) @@ -249,7 +264,7 @@ void Widget_UpdateDimensions(tElement *Element) if( child->Flags & ELEFLAG_ABSOLUTEPOS ) continue ; // --- Width --- - if( child->Flags & ELEFLAG_NOEXPAND ) + if( child->Flags & (bVertical ? ELEFLAG_NOEXPAND : ELEFLAG_NOSTRETCH) ) w = child->MinW; else if( bVertical ) w = child->FixedCross ? child->FixedCross : fullCross; @@ -257,7 +272,7 @@ void Widget_UpdateDimensions(tElement *Element) w = child->FixedWith ? child->FixedWith : dynWith; // --- Height --- - if( child->Flags & ELEFLAG_NOSTRETCH ) + if( child->Flags & (bVertical ? ELEFLAG_NOSTRETCH : ELEFLAG_NOEXPAND) ) h = child->MinH; else if( bVertical ) h = child->FixedWith ? child->FixedWith : dynWith; @@ -289,7 +304,6 @@ void Widget_UpdateDimensions(tElement *Element) */ void Widget_UpdatePosition(tElement *Element) { - tElement *child; int x, y; if( Element->Flags & ELEFLAG_NORENDER ) return ; @@ -306,7 +320,7 @@ void Widget_UpdatePosition(tElement *Element) y = Element->CachedY + Element->PaddingT; // Update each child - for(child = Element->FirstChild; child; child = child->NextSibling) + for(tElement *child = Element->FirstChild; child; child = child->NextSibling) { int newX, newY; // Ignore elements that will not be rendered @@ -357,7 +371,6 @@ void Widget_UpdatePosition(tElement *Element) */ void Widget_UpdateMinDims(tElement *Element) { - tElement *child; int minW, minH; int nChildren; @@ -367,7 +380,7 @@ void Widget_UpdateMinDims(tElement *Element) minH = 0; nChildren = 0; - for(child = Element->FirstChild; child; child = child->NextSibling) + for( tElement *child = Element->FirstChild; child; child = child->NextSibling ) { int cross; @@ -404,14 +417,13 @@ void Widget_UpdateMinDims(tElement *Element) tElement *Widget_GetElementByPos(tWidgetWin *Info, int X, int Y) { - tElement *ret, *next, *ele; - - next = &Info->RootElement; - do - { + tElement *ret; + tElement *next = &Info->RootElement; + // Scan down tree + do { ret = next; next = NULL; - for(ele = ret->FirstChild; ele; ele = ele->NextSibling) + for(tElement *ele = ret->FirstChild; ele; ele = ele->NextSibling) { if(ele->Flags & ELEFLAG_NORENDER) continue; if(X < ele->CachedX) continue; @@ -442,6 +454,12 @@ tElement *Widget_int_Create(tWidgetWin *Info, tElement *Parent, int ID, int Type { if( Widget_GetElementById(Info, ID) ) return NULL; + if( Type >= NUM_ELETYPES ) { + return NULL; + } + + _SysDebug("Widget Create #%i '%s' 0x%x", + ID, gaWM_WidgetTypes[Type]->Name, Flags); // Create new element tElement *new = calloc(sizeof(tElement), 1); @@ -455,7 +473,7 @@ tElement *Widget_int_Create(tWidgetWin *Info, tElement *Parent, int ID, int Type new->PaddingL = 2; new->PaddingR = 2; new->CachedX = -1; - + if( gaWM_WidgetTypes[Type]->Init ) gaWM_WidgetTypes[Type]->Init(new); @@ -536,6 +554,9 @@ int Widget_IPC_NewWidgetSubwin(tWindow *Win, size_t Len, const void *Data) return -1; if( strnlen(Msg->DebugName, max_debugname_len) == max_debugname_len ) return -1; + + _SysDebug("Widget_NewWidgetSubwin(%i %i Type %i Flags 0x%x Subwin %i)", + Msg->Parent, Msg->NewID, Msg->Type, Msg->Flags, Msg->WindowHandle); parent = Widget_GetElementById(Info, Msg->Parent); if(!parent) return 1; @@ -555,6 +576,8 @@ int Widget_IPC_SetFocus(tWindow *Win, size_t Len, const void *Data) tElement *ele; const tWidgetIPC_SetFocus *msg = Data; if(Len < sizeof(*msg)) return -1; + + _SysDebug("Widget_SetFocus(%i)", msg->WidgetID); ele = Widget_GetElementById(info, msg->WidgetID); Widget_SetFocus(info, ele); @@ -589,6 +612,8 @@ int Widget_IPC_SetSize(tWindow *Win, size_t Len, const void *Data) if( Len < sizeof(*Msg) ) return -1; + + _SysDebug("Widget_SetSize(%i, %i)", Msg->WidgetID, Msg->Value); ele = Widget_GetElementById(Info, Msg->WidgetID); if(!ele) return 1; @@ -608,11 +633,13 @@ int Widget_IPC_SetText(tWindow *Win, size_t Len, const void *Data) if( Msg->Text[Len - sizeof(*Msg) - 1] != '\0' ) return -1; + _SysDebug("Widget_SetText(%i, '%.30s')", Msg->WidgetID, Msg->Text); ele = Widget_GetElementById(Info, Msg->WidgetID); if(!ele) return 1; if( gaWM_WidgetTypes[ele->Type]->UpdateText ) { + _SysDebug(" - calling handler"); gaWM_WidgetTypes[ele->Type]->UpdateText( ele, Msg->Text ); } // else