X-Git-Url: https://git.dogcows.com/gitweb?a=blobdiff_plain;f=src%2Fclient.cc;h=f770fecd9f842c6625ed89ced3a03ddaef487f46;hb=73f6bb1a7b6bb5f8b9cf22587722d713a1f15b59;hp=f391746c3b90b7156dd54761a93bdccb6b083d3e;hpb=9dc76e1bace5ca5190e25a50a098739aaecc6ccf;p=chaz%2Fopenbox diff --git a/src/client.cc b/src/client.cc index f391746c..f770fecd 100644 --- a/src/client.cc +++ b/src/client.cc @@ -1,7 +1,11 @@ // -*- mode: C++; indent-tabs-mode: nil; c-basic-offset: 2; -*- +#ifdef HAVE_CONFIG_H +# include "../config.h" +#endif + #include "client.hh" -#include "screen.hh" +#include "bbscreen.hh" #include "openbox.hh" #include "otk/display.hh" #include "otk/property.hh" @@ -18,8 +22,8 @@ extern "C" { namespace ob { -OBClient::OBClient(Window window) - : _window(window) +OBClient::OBClient(int screen, Window window) + : _screen(screen), _window(window) { assert(window); @@ -33,7 +37,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(); @@ -42,8 +79,10 @@ OBClient::OBClient(Window window) updateWMHints(); // XXX: updateTransientFor(); updateTitle(); + updateIconTitle(); updateClass(); +/* #ifdef DEBUG printf("Mapped window: 0x%lx\n" " title: \t%s\t icon title: \t%s\n" @@ -89,6 +128,7 @@ OBClient::OBClient(Window window) _floating ? "yes" : "no", _positioned ? "yes" : "no"); #endif +*/ } @@ -171,12 +211,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 +236,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 +251,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; @@ -285,9 +319,13 @@ void OBClient::getShaped() if (otk::OBDisplay::shape()) { int foo; unsigned int ufoo; + int s; - XShapeQueryExtents(otk::OBDisplay::display, client.window, &_shaped, &foo, + XShapeSelectInput(otk::OBDisplay::display, _window, ShapeNotifyMask); + + XShapeQueryExtents(otk::OBDisplay::display, _window, &s, &foo, &foo, &ufoo, &ufoo, &foo, &foo, &foo, &ufoo, &ufoo); + _shaped = (s != 0); } #endif // SHAPE } @@ -301,17 +339,15 @@ void OBClient::updateProtocols() int num_return = 0; _focus_notify = false; + _decorations &= ~Decor_Close; + _functions &= ~Func_Close; 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 @@ -415,6 +451,25 @@ void OBClient::updateTitle() } +void OBClient::updateIconTitle() +{ + const otk::OBProperty *property = Openbox::instance->property(); + + _icon_title = ""; + + // try netwm + if (! property->get(_window, otk::OBProperty::net_wm_icon_name, + otk::OBProperty::utf8, &_icon_title)) { + // try old x stuff + property->get(_window, otk::OBProperty::wm_icon_name, + otk::OBProperty::ascii, &_icon_title); + } + + if (_title.empty()) + _icon_title = _("Unnamed Window"); +} + + void OBClient::updateClass() { const otk::OBProperty *property = Openbox::instance->property(); @@ -443,10 +498,11 @@ void OBClient::update(const XPropertyEvent &e) else if (e.atom == XA_WM_HINTS) updateWMHints(); else if (e.atom == property->atom(otk::OBProperty::net_wm_name) || - e.atom == property->atom(otk::OBProperty::wm_name) || - e.atom == property->atom(otk::OBProperty::net_wm_icon_name) || - e.atom == property->atom(otk::OBProperty::wm_icon_name)) + e.atom == property->atom(otk::OBProperty::wm_name)) updateTitle(); + else if (e.atom == property->atom(otk::OBProperty::net_wm_icon_name) || + e.atom == property->atom(otk::OBProperty::wm_icon_name)) + updateIconTitle(); else if (e.atom == property->atom(otk::OBProperty::wm_class)) updateClass(); else if (e.atom == property->atom(otk::OBProperty::wm_protocols)) @@ -597,6 +653,14 @@ void OBClient::update(const XClientMessageEvent &e) } +#if defined(SHAPE) || defined(DOXYGEN_IGNORE) +void OBClient::update(const XShapeEvent &e) +{ + _shaped = e.shaped; +} +#endif + + void OBClient::setArea(const otk::Rect &area) { _area = area;