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