mwmhints.c revision 0bbfda8a
10bbfda8aSnia/*
20bbfda8aSnia * Copyright 2014 Olaf Seibert
3645f5050Syouri */
4645f5050Syouri
5645f5050Syouri/*
6645f5050Syouri * Code to look at a few Motif Window Manager hints.
7645f5050Syouri *
8645f5050Syouri * Only the bits marked [v] are actually looked at.
9645f5050Syouri * For the rest, ctwm has no concept, really.
10645f5050Syouri *
11645f5050Syouri * For some information about the meaning of the flags, see
12645f5050Syouri * the manual page VendorShell(3) from the Motif library.
13645f5050Syouri */
14645f5050Syouri
150bbfda8aSnia#include "ctwm.h"
160bbfda8aSnia
17645f5050Syouri#include <stdio.h>
18645f5050Syouri
190bbfda8aSnia#include "ctwm_atoms.h"
200bbfda8aSnia#include "list.h"
21645f5050Syouri#include "mwmhints.h"
220bbfda8aSnia#include "screen.h"
23645f5050Syouri
240bbfda8aSniabool
250bbfda8aSniaGetMWMHints(Window w, MotifWmHints *mwmHints)
26645f5050Syouri{
270bbfda8aSnia	int success;
280bbfda8aSnia	Atom actual_type;
290bbfda8aSnia	int actual_format;
300bbfda8aSnia	unsigned long nitems;
310bbfda8aSnia	unsigned long bytes_after;
320bbfda8aSnia	unsigned long *prop = NULL;
330bbfda8aSnia
340bbfda8aSnia	/* Defaults for when not found */
350bbfda8aSnia	mwmHints->flags = 0;
360bbfda8aSnia	mwmHints->functions = 0;
370bbfda8aSnia	mwmHints->decorations = 0;
38645f5050Syouri#ifdef FULL_MWM_DATA
390bbfda8aSnia	mwmHints->input_mode = 0;
400bbfda8aSnia	mwmHints->status = 0;
41645f5050Syouri#endif
42645f5050Syouri
430bbfda8aSnia	success = XGetWindowProperty(
440bbfda8aSnia	                  dpy, w, XA__MOTIF_WM_HINTS,
450bbfda8aSnia	                  0, 5,           /* long_offset, long long_length, */
460bbfda8aSnia	                  False,          /* Bool delete, */
470bbfda8aSnia	                  AnyPropertyType,/* Atom req_type */
480bbfda8aSnia	                  &actual_type,   /* Atom *actual_type_return, */
490bbfda8aSnia	                  &actual_format, /* int *actual_format_return, */
500bbfda8aSnia	                  &nitems,        /* unsigned long *nitems_return,  */
510bbfda8aSnia	                  &bytes_after,   /* unsigned long * */
520bbfda8aSnia	                  (unsigned char **)&prop);       /* unsigned char ** */
530bbfda8aSnia
540bbfda8aSnia	if(success == Success &&
550bbfda8aSnia	                actual_type == XA__MOTIF_WM_HINTS &&
560bbfda8aSnia	                actual_format == 32 &&
570bbfda8aSnia	                nitems >= 3) {
580bbfda8aSnia		mwmHints->flags = (int)prop[0];
590bbfda8aSnia		mwmHints->functions = (int)prop[1];
600bbfda8aSnia		mwmHints->decorations = (int)prop[2];
61645f5050Syouri#ifdef FULL_MWM_DATA
620bbfda8aSnia		mwmHints->input_mode = (int)prop[3];
630bbfda8aSnia		mwmHints->status = (int)prop[4];
64645f5050Syouri#endif
65645f5050Syouri
660bbfda8aSnia		if(mwmHints->flags & MWM_HINTS_FUNCTIONS) {
670bbfda8aSnia			if(mwmHints->functions & MWM_FUNC_ALL) {
680bbfda8aSnia				mwmHints->functions ^= ~0;
690bbfda8aSnia			}
700bbfda8aSnia		}
710bbfda8aSnia		if(mwmHints->flags & MWM_HINTS_DECORATIONS) {
720bbfda8aSnia			if(mwmHints->decorations & MWM_DECOR_ALL) {
730bbfda8aSnia				mwmHints->decorations ^= ~0;
740bbfda8aSnia			}
750bbfda8aSnia		}
760bbfda8aSnia
770bbfda8aSnia		success = true;
78645f5050Syouri	}
790bbfda8aSnia	else {
800bbfda8aSnia		success = false;
81645f5050Syouri	}
82645f5050Syouri
830bbfda8aSnia	if(prop != NULL) {
840bbfda8aSnia		XFree(prop);
850bbfda8aSnia	}
860bbfda8aSnia
870bbfda8aSnia	return success;
880bbfda8aSnia}
89645f5050Syouri
90645f5050Syouri
910bbfda8aSnia
920bbfda8aSnia/*
930bbfda8aSnia * Simple test wrappers
940bbfda8aSnia */
950bbfda8aSniastatic bool
960bbfda8aSniamwm_sets_decorations(MotifWmHints *hints)
970bbfda8aSnia{
980bbfda8aSnia	return (hints->flags & MWM_HINTS_DECORATIONS) ? true : false;
99645f5050Syouri}
100645f5050Syouri
1010bbfda8aSnia
1020bbfda8aSnia/* 1 = yes   0 = no   -1 = no opinion */
1030bbfda8aSniaint
1040bbfda8aSniamwm_has_border(MotifWmHints *hints)
1050bbfda8aSnia{
1060bbfda8aSnia	/* No opinion if hints don't set decoration info */
1070bbfda8aSnia	if(!mwm_sets_decorations(hints)) {
1080bbfda8aSnia		return -1;
1090bbfda8aSnia	}
1100bbfda8aSnia
1110bbfda8aSnia	/* No opinion if the user told us to ignore it */
1120bbfda8aSnia	if(LookInNameList(Scr->MWMIgnore, "DECOR_BORDER")) {
1130bbfda8aSnia		return -1;
1140bbfda8aSnia	}
1150bbfda8aSnia
1160bbfda8aSnia	/* No border if hints said so */
1170bbfda8aSnia	if((hints->decorations & MWM_DECOR_BORDER) == 0) {
1180bbfda8aSnia		return 0;
1190bbfda8aSnia	}
1200bbfda8aSnia
1210bbfda8aSnia	/* Else border */
1220bbfda8aSnia	return 1;
1230bbfda8aSnia}
1240bbfda8aSnia
1250bbfda8aSnia
1260bbfda8aSniabool
1270bbfda8aSniamwm_sets_title(MotifWmHints *hints)
1280bbfda8aSnia{
1290bbfda8aSnia	/* Not if we don't have decoration info */
1300bbfda8aSnia	if(!mwm_sets_decorations(hints)) {
1310bbfda8aSnia		return false;
1320bbfda8aSnia	}
1330bbfda8aSnia
1340bbfda8aSnia	/* Not if the user wants to ignore title frobbing */
1350bbfda8aSnia	if(LookInNameList(Scr->MWMIgnore, "DECOR_TITLE")) {
1360bbfda8aSnia		return false;
1370bbfda8aSnia	}
1380bbfda8aSnia
1390bbfda8aSnia	/* Else we do have info to use */
1400bbfda8aSnia	return true;
1410bbfda8aSnia}
1420bbfda8aSnia
1430bbfda8aSnia
1440bbfda8aSniabool
1450bbfda8aSniamwm_has_title(MotifWmHints *hints)
1460bbfda8aSnia{
1470bbfda8aSnia	if(mwm_sets_decorations(hints)
1480bbfda8aSnia	                && ((hints->decorations & MWM_DECOR_TITLE) == 0)) {
1490bbfda8aSnia		return false;
1500bbfda8aSnia	}
1510bbfda8aSnia	return true;
1520bbfda8aSnia}
153