+
+ // TODO: Update dimensions of all child elements?
+
+ return 0; }
+
+ case WNDMSG_MOUSEBTN: {
+ struct sWndMsg_MouseButton *msg = Data;
+ tWidgetMsg_MouseBtn client_msg;
+ tElement *ele;
+ int x, y;
+ int rv;
+
+ if(Len < sizeof(*msg)) return -1;
+
+ x = msg->X; y = msg->Y;
+ client_msg.Button = msg->Button;
+ client_msg.bPressed = msg->bPressed;
+
+ ele = Widget_GetElementByPos(info, x, y);
+ // Send event to all elements from `ele` upwards
+ for( ; ele; ele = ele->Parent )
+ {
+ if(ele->Type < ciWM_NumWidgetTypes && gaWM_WidgetTypes[ele->Type].MouseButton)
+ {
+ rv = gaWM_WidgetTypes[ele->Type].MouseButton(
+ ele,
+ x - ele->CachedX, y - ele->CachedY,
+ msg->Button, msg->bPressed
+ );
+ // Allow a type to trap the input from going any higher
+ if(rv == 0) break;
+ }
+ else
+ {
+ // Pass to user
+ client_msg.X = x - ele->CachedX;
+ client_msg.Y = y - ele->CachedY;
+ client_msg.WidgetID = ele->ID;
+ WM_SendMessage(Target, Target, MSG_WIDGET_MOUSEBTN, sizeof(client_msg), &client_msg);
+ }
+ }