This commit is contained in:
IoIxD
2026-01-04 13:06:36 -07:00
parent d784770ca9
commit 54cdd85015
6 changed files with 36 additions and 4 deletions

View File

@@ -354,6 +354,11 @@ MWDECL void MwGetCursorCoord(MwWidget handle, MwPoint* point);
*/
MWDECL void MwGetScreenSize(MwWidget handle, MwRect* rect);
/*!
* @brief Reports whether a widget reports global or local coordinates upon GetXY/SetXY. Anything with a parent reports local, and most backends report global coordinates being supported for top level windows, but some (Wayland) do not.
*/
MWDECL int MwGetCoordinateType(MwWidget handle);
#ifdef __cplusplus
}
#endif

View File

@@ -33,6 +33,7 @@ struct _MwLLCommon {
void* user;
int copy_buffer;
int type;
int coordinate_type;
MwLLHandler handler;
};

View File

@@ -219,4 +219,10 @@ struct _MwClass {
void* reserved4;
};
/* Whether or not GetXY/SetXY works with global or local coordinates */
enum MwCoordinateType {
MwCoordinatesGlobal = 0,
MwCoordinatesLocal,
};
#endif

View File

@@ -1344,6 +1344,10 @@ static MwLL MwLLCreateImpl(MwLL parent, int x, int y, int width, int height) {
memset(r, 0, sizeof(*r));
MwLLCreateCommon(r);
/* Wayland does not report global coordinates ever. Compositors are not even expected to have knowledge of this.
*/
r->common.coordinate_type = MwCoordinatesLocal;
r->common.type = MwLLBackendWayland;
if(width < 2) width = 2;

View File

@@ -797,3 +797,11 @@ void MwGetCursorCoord(MwWidget handle, MwPoint* point) {
void MwGetScreenSize(MwWidget handle, MwRect* rect) {
MwLLGetScreenSize(handle->lowlevel, rect);
}
int MwGetCoordinateType(MwWidget handle) {
if(handle->parent == NULL) {
return handle->lowlevel->common.coordinate_type;
} else {
return MwCoordinatesLocal;
}
};

View File

@@ -183,10 +183,18 @@ static void mwSubMenuAppearImpl(MwWidget handle, MwMenu menu, MwPoint* point, in
MwLLMakeToolWindow(handle->lowlevel);
MwLLDetach(handle->lowlevel, &p);
if(MwGetInteger(handle, MwNy) + sz.height > rc.height) {
MwVaApply(handle,
MwNy, rc.height - sz.height,
NULL);
if(handle->lowlevel->common.coordinate_type == MwCoordinatesGlobal) {
if(MwGetInteger(handle, MwNy) + sz.height > rc.height) {
MwVaApply(handle,
MwNy, rc.height - sz.height,
NULL);
}
} else {
if(MwGetInteger(handle, MwNy) > sz.height) {
MwVaApply(handle,
MwNy, sz.height,
NULL);
}
}
MwLLEndStateChange(handle->lowlevel);