// Copyright status: this file is in the public domain. #include "lx.h" #include "internal.h" int lx_icccm_geometry(LX_SIZE_HINTS *sh, const LX_GEOMETRY *g) { unsigned int set; unsigned int clr; if (sh->lx__version != ICCCM_INTF_VERSION_1) return(LX_GEOM_ERR_INVALID); set = 0; clr = 0; switch (g->flags & (LX_GEOM_PX|LX_GEOM_NX)) { case LX_GEOM_PX: case LX_GEOM_NX: set |= LX_S_HINT_UPOS; clr |= LX_S_HINT_PPOS; break; case 0: set |= LX_S_HINT_PPOS; clr |= LX_S_HINT_UPOS; break; default: return(LX_GEOM_ERR_INVALID); break; } switch (g->flags & (LX_GEOM_PY|LX_GEOM_NY)) { case LX_GEOM_PY: case LX_GEOM_NY: set |= LX_S_HINT_UPOS; clr |= LX_S_HINT_PPOS; break; case 0: set |= LX_S_HINT_PPOS; clr |= LX_S_HINT_UPOS; break; default: return(LX_GEOM_ERR_INVALID); break; } // In case of conflict, go with UPOS. if ((set & (LX_S_HINT_PPOS|LX_S_HINT_UPOS)) == (LX_S_HINT_PPOS|LX_S_HINT_UPOS)) { set = LX_S_HINT_UPOS; clr = LX_S_HINT_PPOS; } sh->flags = (sh->flags & ~clr) | set; if (g->flags & (LX_GEOM_W|LX_GEOM_H)) { sh->flags |= LX_S_HINT_USIZE; } else { sh->flags |= LX_S_HINT_PSIZE; } return(0); }