set the client's desired decoration and function flags
This commit is contained in:
parent
9dc76e1bac
commit
f7f3cd4085
2 changed files with 59 additions and 38 deletions
|
@ -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) {
|
// 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))
|
} 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
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue