From f7f3cd4085b8210bcefc1fd1f40df6eafea3035e Mon Sep 17 00:00:00 2001 From: Dana Jansens Date: Wed, 6 Nov 2002 11:44:15 +0000 Subject: [PATCH] set the client's desired decoration and function flags --- src/client.cc | 69 ++++++++++++++++++++++++++++++++++----------------- src/client.hh | 28 ++++++++++----------- 2 files changed, 59 insertions(+), 38 deletions(-) diff --git a/src/client.cc b/src/client.cc index f391746c..6b67f3c2 100644 --- a/src/client.cc +++ b/src/client.cc @@ -33,7 +33,40 @@ OBClient::OBClient(Window window) getArea(); getDesktop(); 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(); getShaped(); @@ -171,12 +204,10 @@ void OBClient::getType() //else _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(); @@ -198,7 +229,7 @@ void OBClient::getMWMHints() // Mwm Hints are applied subtractively to what has already been chosen for // decor and functionality - if (hints->flags & MwmDecorations) { + if (hints->flags & MwmFlag_Decorations) { if (! (hints->decorations & MwmDecor_All)) { if (! (hints->decorations & MwmDecor_Border)) _decorations &= ~Decor_Border; @@ -213,22 +244,18 @@ void OBClient::getMWMHints() } } - _mwm_functions = 0xffffffff; // everything! - - if (hints->flags & MwmFunctions) { + if (hints->flags & MwmFlag_Functions) { if (! (hints->functions & MwmFunc_All)) { - _mwm_functions = hints->functions; - if (! (hints->functions & MwmFunc_Resize)) - functions &= ~Func_Resize; + _functions &= ~Func_Resize; if (! (hints->functions & MwmFunc_Move)) - functions &= ~Func_Move; + _functions &= ~Func_Move; if (! (hints->functions & MwmFunc_Iconify)) - functions &= ~Func_Iconify; + _functions &= ~Func_Iconify; if (! (hints->functions & MwmFunc_Maximize)) - functions &= ~Func_Maximize; - if (! (hints->functions & MwmFunc_Close)) - functions &= ~Func_Close; + _functions &= ~Func_Maximize; + //if (! (hints->functions & MwmFunc_Close)) + // _functions &= ~Func_Close; } } delete [] hints; @@ -305,13 +332,9 @@ void OBClient::updateProtocols() if (XGetWMProtocols(otk::OBDisplay::display, _window, &proto, &num_return)) { for (int i = 0; i < num_return; ++i) { if (proto[i] == property->atom(otk::OBProperty::wm_delete_window)) { - // add the close button/functionality only if the mwm hints didnt - // exclude it - if (_mwm_functions & MwmFunc_Close) { - decorations |= Decor_Close; - functions |= Func_Close; - // XXX: update the decor? - } + _decorations |= Decor_Close; + _functions |= Func_Close; + // XXX: update the decor? } else if (proto[i] == property->atom(otk::OBProperty::wm_take_focus)) // if this protocol is requested, then the window will be notified // by the window manager whenever it receives focus diff --git a/src/client.hh b/src/client.hh index 7e864744..48809362 100644 --- a/src/client.hh +++ b/src/client.hh @@ -29,23 +29,24 @@ public: Type_Dialog, Type_Normal }; - enum MwmFlags { MwmFunctions = 1 << 0, - MwmDecorations = 1 << 1 }; + enum MwmFlags { MwmFlag_Functions = 1 << 0, + MwmFlag_Decorations = 1 << 1 }; enum MwmFunctions { MwmFunc_All = 1 << 0, MwmFunc_Resize = 1 << 1, MwmFunc_Move = 1 << 2, MwmFunc_Iconify = 1 << 3, - MwmFunc_Maximize = 1 << 4, - MwmFunc_Close = 1 << 5 }; + MwmFunc_Maximize = 1 << 4 + //MwmFunc_Close = 1 << 5 + }; - enum MemDecorations { MemDecor_All = 1 << 0, - MemDecor_Border = 1 << 1, - MemDecor_Handle = 1 << 2, - MemDecor_Title = 1 << 3, - //MemDecor_Menu = 1 << 4, - MemDecor_Iconify = 1 << 5, - MemDecor_Maximize = 1 << 6 }; + enum MemDecorations { MwmDecor_All = 1 << 0, + MwmDecor_Border = 1 << 1, + MwmDecor_Handle = 1 << 2, + MwmDecor_Title = 1 << 3, + //MwmDecor_Menu = 1 << 4, + MwmDecor_Iconify = 1 << 5, + MwmDecor_Maximize = 1 << 6 }; // the things the user can do to the client window enum Function { Func_Resize = 1 << 0, @@ -67,7 +68,7 @@ public: // 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 typedef struct MwmHints { - static const int elements = 3; + static const unsigned int elements = 3; unsigned long flags; unsigned long functions; unsigned long decorations; @@ -164,9 +165,6 @@ private: */ DecorationFlags _decorations; - //! The functions requested by the Mwm Hints - int _mwm_functions; - //! A bitmask of values in the OBClient::Function enum /*! The values in the variable specify the ways in which the user is allowed to -- 2.44.0