diff --git a/clay.h b/clay.h index 337c098..8a275a9 100644 --- a/clay.h +++ b/clay.h @@ -311,6 +311,12 @@ typedef struct Clay_FloatingAttachPointType parent; } Clay_FloatingAttachPoints; +typedef enum { + CLAY_POINTER_CAPTURE_MODE_CAPTURE, + CLAY_POINTER_CAPTURE_MODE_PARENT, + CLAY_POINTER_CAPTURE_MODE_PASSTHROUGH, +} Clay_PointerCaptureMode; + typedef struct { Clay_Vector2 offset; @@ -318,6 +324,7 @@ typedef struct uint16_t zIndex; uint32_t parentId; Clay_FloatingAttachPoints attachment; + Clay_PointerCaptureMode capturePointer; } Clay_FloatingElementConfig; // Custom @@ -3518,6 +3525,7 @@ void Clay_SetPointerState(Clay_Vector2 position, bool isPointerDown) { Clay__LayoutElementTreeRoot *root = Clay__LayoutElementTreeRootArray_Get(&Clay__layoutElementTreeRoots, rootIndex); Clay__int32_tArray_Add(&dfsBuffer, (int32_t)root->layoutElementIndex); Clay__treeNodeVisited.internalArray[0] = false; + bool found = false; while (dfsBuffer.length > 0) { if (Clay__treeNodeVisited.internalArray[dfsBuffer.length - 1]) { dfsBuffer.length--; @@ -3535,6 +3543,7 @@ void Clay_SetPointerState(Clay_Vector2 position, bool isPointerDown) { mapItem->onHoverFunction(mapItem->elementId, Clay__pointerInfo, mapItem->hoverFunctionUserData); } Clay__ElementIdArray_Add(&Clay__pointerOverIds, mapItem->elementId); + found = true; } if (Clay__ElementHasConfig(currentElement, CLAY__ELEMENT_CONFIG_TYPE_TEXT)) { dfsBuffer.length--; @@ -3548,6 +3557,12 @@ void Clay_SetPointerState(Clay_Vector2 position, bool isPointerDown) { dfsBuffer.length--; } } + + Clay_LayoutElement *rootElement = Clay_LayoutElementArray_Get(&Clay__layoutElements, Clay__int32_tArray_Get(&dfsBuffer, (int)dfsBuffer.length - 1)); + if (found && Clay__ElementHasConfig(rootElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING_CONTAINER) && + Clay__FindElementConfigWithType(rootElement, CLAY__ELEMENT_CONFIG_TYPE_FLOATING_CONTAINER).floatingElementConfig->capturePointer == CLAY_POINTER_CAPTURE_MODE_CAPTURE) { + break; + } } if (isPointerDown) {