mirror of
https://gitea.nishi.boats/pyrite-dev/milsko
synced 2026-01-11 11:53:29 +00:00
coords
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -33,6 +33,7 @@ struct _MwLLCommon {
|
||||
void* user;
|
||||
int copy_buffer;
|
||||
int type;
|
||||
int coordinate_type;
|
||||
|
||||
MwLLHandler handler;
|
||||
};
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
};
|
||||
|
||||
@@ -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);
|
||||
|
||||
Reference in New Issue
Block a user