set the client's desired decoration and function flags

This commit is contained in:
Dana Jansens 2002-11-06 11:44:15 +00:00
parent 9dc76e1bac
commit f7f3cd4085
2 changed files with 59 additions and 38 deletions

View file

@ -33,7 +33,40 @@ OBClient::OBClient(Window window)
getArea(); getArea();
getDesktop(); getDesktop();
getType(); getType();
getMwmHints();
// set the decorations and functions
switch (_type) {
case Type_Normal:
// normal windows retain all of the possible decorations and
// functionality
_decorations = Decor_Titlebar | Decor_Handle | Decor_Border |
Decor_Iconify | Decor_Maximize;
_functions = Func_Resize | Func_Move | Func_Iconify | Func_Maximize;
case Type_Dialog:
// dialogs cannot be maximized
_decorations &= ~Decor_Maximize;
_functions &= ~Func_Maximize;
break;
case Type_Menu:
case Type_Toolbar:
case Type_Utility:
// these windows get less functionality
_decorations &= ~(Decor_Iconify | Decor_Handle);
_functions &= ~(Func_Iconify | Func_Resize);
break;
case Type_Desktop:
case Type_Dock:
case Type_Splash:
// none of these windows are manipulated by the window manager
_decorations = 0;
_functions = 0;
break;
}
getMwmHints(); // this fucks (in good ways) with the decors and functions
getState(); getState();
getShaped(); getShaped();
@ -171,12 +204,10 @@ void OBClient::getType()
//else //else
_type = Type_Normal; _type = Type_Normal;
} }
// set the decorations and functions based on the type of the window
} }
void OBClient::getMWMHints() void OBClient::getMwmHints()
{ {
const otk::OBProperty *property = Openbox::instance->property(); const otk::OBProperty *property = Openbox::instance->property();
@ -198,7 +229,7 @@ void OBClient::getMWMHints()
// Mwm Hints are applied subtractively to what has already been chosen for // Mwm Hints are applied subtractively to what has already been chosen for
// decor and functionality // decor and functionality
if (hints->flags & MwmDecorations) { if (hints->flags & MwmFlag_Decorations) {
if (! (hints->decorations & MwmDecor_All)) { if (! (hints->decorations & MwmDecor_All)) {
if (! (hints->decorations & MwmDecor_Border)) if (! (hints->decorations & MwmDecor_Border))
_decorations &= ~Decor_Border; _decorations &= ~Decor_Border;
@ -213,22 +244,18 @@ void OBClient::getMWMHints()
} }
} }
_mwm_functions = 0xffffffff; // everything! if (hints->flags & MwmFlag_Functions) {
if (hints->flags & MwmFunctions) {
if (! (hints->functions & MwmFunc_All)) { if (! (hints->functions & MwmFunc_All)) {
_mwm_functions = hints->functions;
if (! (hints->functions & MwmFunc_Resize)) if (! (hints->functions & MwmFunc_Resize))
functions &= ~Func_Resize; _functions &= ~Func_Resize;
if (! (hints->functions & MwmFunc_Move)) if (! (hints->functions & MwmFunc_Move))
functions &= ~Func_Move; _functions &= ~Func_Move;
if (! (hints->functions & MwmFunc_Iconify)) if (! (hints->functions & MwmFunc_Iconify))
functions &= ~Func_Iconify; _functions &= ~Func_Iconify;
if (! (hints->functions & MwmFunc_Maximize)) if (! (hints->functions & MwmFunc_Maximize))
functions &= ~Func_Maximize; _functions &= ~Func_Maximize;
if (! (hints->functions & MwmFunc_Close)) //if (! (hints->functions & MwmFunc_Close))
functions &= ~Func_Close; // _functions &= ~Func_Close;
} }
} }
delete [] hints; delete [] hints;
@ -305,13 +332,9 @@ void OBClient::updateProtocols()
if (XGetWMProtocols(otk::OBDisplay::display, _window, &proto, &num_return)) { if (XGetWMProtocols(otk::OBDisplay::display, _window, &proto, &num_return)) {
for (int i = 0; i < num_return; ++i) { for (int i = 0; i < num_return; ++i) {
if (proto[i] == property->atom(otk::OBProperty::wm_delete_window)) { if (proto[i] == property->atom(otk::OBProperty::wm_delete_window)) {
// add the close button/functionality only if the mwm hints didnt _decorations |= Decor_Close;
// exclude it _functions |= Func_Close;
if (_mwm_functions & MwmFunc_Close) {
decorations |= Decor_Close;
functions |= Func_Close;
// XXX: update the decor? // XXX: update the decor?
}
} else if (proto[i] == property->atom(otk::OBProperty::wm_take_focus)) } else if (proto[i] == property->atom(otk::OBProperty::wm_take_focus))
// if this protocol is requested, then the window will be notified // if this protocol is requested, then the window will be notified
// by the window manager whenever it receives focus // by the window manager whenever it receives focus

View file

@ -29,23 +29,24 @@ public:
Type_Dialog, Type_Dialog,
Type_Normal }; Type_Normal };
enum MwmFlags { MwmFunctions = 1 << 0, enum MwmFlags { MwmFlag_Functions = 1 << 0,
MwmDecorations = 1 << 1 }; MwmFlag_Decorations = 1 << 1 };
enum MwmFunctions { MwmFunc_All = 1 << 0, enum MwmFunctions { MwmFunc_All = 1 << 0,
MwmFunc_Resize = 1 << 1, MwmFunc_Resize = 1 << 1,
MwmFunc_Move = 1 << 2, MwmFunc_Move = 1 << 2,
MwmFunc_Iconify = 1 << 3, MwmFunc_Iconify = 1 << 3,
MwmFunc_Maximize = 1 << 4, MwmFunc_Maximize = 1 << 4
MwmFunc_Close = 1 << 5 }; //MwmFunc_Close = 1 << 5
};
enum MemDecorations { MemDecor_All = 1 << 0, enum MemDecorations { MwmDecor_All = 1 << 0,
MemDecor_Border = 1 << 1, MwmDecor_Border = 1 << 1,
MemDecor_Handle = 1 << 2, MwmDecor_Handle = 1 << 2,
MemDecor_Title = 1 << 3, MwmDecor_Title = 1 << 3,
//MemDecor_Menu = 1 << 4, //MwmDecor_Menu = 1 << 4,
MemDecor_Iconify = 1 << 5, MwmDecor_Iconify = 1 << 5,
MemDecor_Maximize = 1 << 6 }; MwmDecor_Maximize = 1 << 6 };
// the things the user can do to the client window // the things the user can do to the client window
enum Function { Func_Resize = 1 << 0, enum Function { Func_Resize = 1 << 0,
@ -67,7 +68,7 @@ public:
// this structure only contains 3 elements... the Motif 2.0 structure // this structure only contains 3 elements... the Motif 2.0 structure
// contains 5... we only need the first 3... so that is all we will define // contains 5... we only need the first 3... so that is all we will define
typedef struct MwmHints { typedef struct MwmHints {
static const int elements = 3; static const unsigned int elements = 3;
unsigned long flags; unsigned long flags;
unsigned long functions; unsigned long functions;
unsigned long decorations; unsigned long decorations;
@ -164,9 +165,6 @@ private:
*/ */
DecorationFlags _decorations; DecorationFlags _decorations;
//! The functions requested by the Mwm Hints
int _mwm_functions;
//! A bitmask of values in the OBClient::Function enum //! A bitmask of values in the OBClient::Function enum
/*! /*!
The values in the variable specify the ways in which the user is allowed to The values in the variable specify the ways in which the user is allowed to