+
+
+void AxWin3_Widget_DelWidget(tAxWin3_Widget *Widget)
+{
+ tWidgetIPC_Delete msg;
+ tWidgetWindowInfo *info = AxWin3_int_GetDataPtr(Widget->Window);
+
+ msg.WidgetID = Widget->ID;
+ AxWin3_SendIPC(Widget->Window, IPC_WIDGET_DELETE, sizeof(msg), &msg);
+
+ info->Elements[Widget->ID] = NULL;
+ if(Widget->ID < info->FirstFreeID)
+ info->FirstFreeID = Widget->ID;
+ 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)
+{
+ tWidgetIPC_SetFlags msg;
+ msg.WidgetID = Widget->ID;
+ msg.Value = FlagSet;
+ msg.Mask = FlagMask;
+
+ AxWin3_SendIPC(Widget->Window, IPC_WIDGET_SETFLAGS, sizeof(msg), &msg);
+}
+
+void AxWin3_Widget_SetSize(tAxWin3_Widget *Widget, int Size)
+{
+ tWidgetIPC_SetSize msg;
+
+ msg.WidgetID = Widget->ID;
+ msg.Value = Size;
+ AxWin3_SendIPC(Widget->Window, IPC_WIDGET_SETSIZE, sizeof(msg), &msg);
+}
+
+void AxWin3_Widget_SetText(tAxWin3_Widget *Widget, const char *Text)
+{
+ char buf[sizeof(tWidgetIPC_SetText) + strlen(Text) + 1];
+ tWidgetIPC_SetText *msg = (void*)buf;
+
+ msg->WidgetID = Widget->ID;
+ strcpy(msg->Text, Text);
+
+ AxWin3_SendIPC(Widget->Window, IPC_WIDGET_SETTEXT, sizeof(buf), buf);
+}
+
+char *AxWin3_Widget_GetText(tAxWin3_Widget *Widget)
+{
+ char buf[sizeof(tWidgetIPC_SetText)];
+ tWidgetIPC_SetText *msg = (void*)buf;
+ size_t retmsg_size;
+
+ msg->WidgetID = Widget->ID;
+
+ AxWin3_SendIPC(Widget->Window, IPC_WIDGET_GETTEXT, sizeof(buf), buf);
+
+ msg = AxWin3_WaitIPCMessage(Widget->Window, IPC_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)
+{
+ tWidgetIPC_SetColour msg;
+
+ msg.WidgetID = Widget->ID;
+ msg.Index = Index;
+ msg.Colour = Colour;
+ AxWin3_SendIPC(Widget->Window, IPC_WIDGET_SETCOLOUR, sizeof(msg), &msg);
+}