#ifdef HAVE_CONFIG_H
#include <config.h>
#endif
#include <X11/Xlibint.h>
#include <X11/Xutil.h>
#include "Xatomtype.h"
#include <X11/Xatom.h>
#include <X11/Xos.h>
#define safestrlen(s) ((s) ? strlen(s) : 0)
int
XSetSizeHints(
Display *dpy,
Window w,
XSizeHints *hints,
Atom property)
{
xPropSizeHints prop;
memset(&prop, 0, sizeof(prop));
prop.flags = (hints->flags & (USPosition|USSize|PAllHints));
if (hints->flags & (USPosition|PPosition)) {
prop.x = hints->x;
prop.y = hints->y;
}
if (hints->flags & (USSize|PSize)) {
prop.width = hints->width;
prop.height = hints->height;
}
if (hints->flags & PMinSize) {
prop.minWidth = hints->min_width;
prop.minHeight = hints->min_height;
}
if (hints->flags & PMaxSize) {
prop.maxWidth = hints->max_width;
prop.maxHeight = hints->max_height;
}
if (hints->flags & PResizeInc) {
prop.widthInc = hints->width_inc;
prop.heightInc = hints->height_inc;
}
if (hints->flags & PAspect) {
prop.minAspectX = hints->min_aspect.x;
prop.minAspectY = hints->min_aspect.y;
prop.maxAspectX = hints->max_aspect.x;
prop.maxAspectY = hints->max_aspect.y;
}
return XChangeProperty (dpy, w, property, XA_WM_SIZE_HINTS, 32,
PropModeReplace, (unsigned char *) &prop,
OldNumPropSizeElements);
}
int
XSetWMHints (
Display *dpy,
Window w,
XWMHints *wmhints)
{
xPropWMHints prop;
memset(&prop, 0, sizeof(prop));
prop.flags = wmhints->flags;
if (wmhints->flags & InputHint)
prop.input = (wmhints->input == True ? 1 : 0);
if (wmhints->flags & StateHint)
prop.initialState = wmhints->initial_state;
if (wmhints->flags & IconPixmapHint)
prop.iconPixmap = wmhints->icon_pixmap;
if (wmhints->flags & IconWindowHint)
prop.iconWindow = wmhints->icon_window;
if (wmhints->flags & IconPositionHint) {
prop.iconX = wmhints->icon_x;
prop.iconY = wmhints->icon_y;
}
if (wmhints->flags & IconMaskHint)
prop.iconMask = wmhints->icon_mask;
if (wmhints->flags & WindowGroupHint)
prop.windowGroup = wmhints->window_group;
return XChangeProperty (dpy, w, XA_WM_HINTS, XA_WM_HINTS, 32,
PropModeReplace, (unsigned char *) &prop,
NumPropWMHintsElements);
}
int
XSetZoomHints (
Display *dpy,
Window w,
XSizeHints *zhints)
{
return XSetSizeHints (dpy, w, zhints, XA_WM_ZOOM_HINTS);
}
int
XSetNormalHints (
Display *dpy,
Window w,
XSizeHints *hints)
{
return XSetSizeHints (dpy, w, hints, XA_WM_NORMAL_HINTS);
}
int
XSetIconSizes (
Display *dpy,
Window w,
XIconSize *list,
int count)
{
register int i;
xPropIconSize *pp, *prop;
#define size_of_the_real_thing sizeof
unsigned nbytes = count * size_of_the_real_thing(xPropIconSize);
#undef size_of_the_real_thing
if ((prop = pp = (xPropIconSize *) Xmalloc (nbytes))) {
for (i = 0; i < count; i++) {
pp->minWidth = list->min_width;
pp->minHeight = list->min_height;
pp->maxWidth = list->max_width;
pp->maxHeight = list->max_height;
pp->widthInc = list->width_inc;
pp->heightInc = list->height_inc;
pp += 1;
list += 1;
}
XChangeProperty (dpy, w, XA_WM_ICON_SIZE, XA_WM_ICON_SIZE, 32,
PropModeReplace, (unsigned char *) prop,
count * NumPropIconSizeElements);
Xfree ((char *)prop);
}
return 1;
}
int
XSetCommand (
Display *dpy,
Window w,
char **argv,
int argc)
{
register int i;
register int nbytes;
register char *buf, *bp;
for (i = 0, nbytes = 0; i < argc; i++) {
nbytes += safestrlen(argv[i]) + 1;
}
if ((bp = buf = Xmalloc((unsigned) nbytes))) {
for (i = 0; i < argc; i++) {
if (argv[i]) {
(void) strcpy(bp, argv[i]);
bp += strlen(argv[i]) + 1;
}
else
*bp++ = '\0';
}
XChangeProperty (dpy, w, XA_WM_COMMAND, XA_STRING, 8,
PropModeReplace, (unsigned char *)buf, nbytes);
Xfree(buf);
}
return 1;
}
int
XSetStandardProperties (
Display *dpy,
Window w,
_Xconst char *name,
_Xconst char *icon_string,
Pixmap icon_pixmap,
char **argv,
int argc,
XSizeHints *hints)
{
XWMHints phints;
phints.flags = 0;
if (name != NULL) XStoreName (dpy, w, name);
if (icon_string != NULL) {
XChangeProperty (dpy, w, XA_WM_ICON_NAME, XA_STRING, 8,
PropModeReplace, (unsigned char *)icon_string, safestrlen(icon_string));
}
if (icon_pixmap != None) {
phints.icon_pixmap = icon_pixmap;
phints.flags |= IconPixmapHint;
}
if (argv != NULL) XSetCommand(dpy, w, argv, argc);
if (hints != NULL) XSetNormalHints(dpy, w, hints);
if (phints.flags != 0) XSetWMHints(dpy, w, &phints);
return 1;
}
int
XSetTransientForHint(
Display *dpy,
Window w,
Window propWindow)
{
return XChangeProperty(dpy, w, XA_WM_TRANSIENT_FOR, XA_WINDOW, 32,
PropModeReplace, (unsigned char *) &propWindow, 1);
}
int
XSetClassHint(
Display *dpy,
Window w,
XClassHint *classhint)
{
char *class_string;
char *s;
int len_nm, len_cl;
len_nm = safestrlen(classhint->res_name);
len_cl = safestrlen(classhint->res_class);
if ((class_string = s = Xmalloc((unsigned) (len_nm + len_cl + 2)))) {
if (len_nm) {
strcpy(s, classhint->res_name);
s += len_nm + 1;
}
else
*s++ = '\0';
if (len_cl)
strcpy(s, classhint->res_class);
else
*s = '\0';
XChangeProperty(dpy, w, XA_WM_CLASS, XA_STRING, 8,
PropModeReplace, (unsigned char *) class_string,
len_nm+len_cl+2);
Xfree(class_string);
}
return 1;
}