X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fscreen.cc;h=dfcc8375d055613f2cfb6749f2e166ac5a252405;hb=f305e7f18dd9745e99518da7ca70183c3084a991;hp=081b68d1a1367c7503c2094250783ee787ff7579;hpb=12108e16e166034cd1840627502280d9a1ab0b9e;p=chaz%2Fopenbox diff --git a/src/screen.cc b/src/screen.cc index 081b68d1..dfcc8375 100644 --- a/src/screen.cc +++ b/src/screen.cc @@ -105,7 +105,7 @@ Screen::Screen(int screen) _desktop = 0; - if (!python_get_long("NUMBER_OF_DESKTOPS", &_num_desktops)) + if (!python_get_long("NUMBER_OF_DESKTOPS", (long*)&_num_desktops)) _num_desktops = 1; changeNumDesktops(_num_desktops); // set the hint @@ -123,6 +123,8 @@ Screen::Screen(int screen) // the manageExising() function changeClientList(); // initialize the client lists, which will be empty + updateDesktopLayout(); + // register this class as the event handler for the root window openbox->registerHandler(_info->rootWindow(), this); @@ -198,6 +200,65 @@ void Screen::manageExisting() XFree(children); } +void Screen::updateDesktopLayout() +{ + //const unsigned long _NET_WM_ORIENTATION_HORZ = 0; + const unsigned long _NET_WM_ORIENTATION_VERT = 1; + //const unsigned long _NET_WM_TOPLEFT = 0; + const unsigned long _NET_WM_TOPRIGHT = 1; + const unsigned long _NET_WM_BOTTOMRIGHT = 2; + const unsigned long _NET_WM_BOTTOMLEFT = 3; + + // defaults + _layout.orientation = DesktopLayout::Horizontal; + _layout.start_corner = DesktopLayout::TopLeft; + _layout.rows = 1; + _layout.columns = _num_desktops; + + unsigned long *data, num = 4; + if (otk::Property::get(_info->rootWindow(), + otk::Property::atoms.net_desktop_layout, + otk::Property::atoms.cardinal, + &num, &data)) { + if (num >= 4) { + if (data[0] == _NET_WM_ORIENTATION_VERT) + _layout.orientation = DesktopLayout::Vertical; + if (data[3] == _NET_WM_TOPRIGHT) + _layout.start_corner = DesktopLayout::TopRight; + else if (data[3] == _NET_WM_BOTTOMRIGHT) + _layout.start_corner = DesktopLayout::BottomRight; + else if (data[3] == _NET_WM_BOTTOMLEFT) + _layout.start_corner = DesktopLayout::BottomLeft; + + // fill in a zero rows/columns + if (!(data[1] == 0 && data[2] == 0)) { // both 0's is bad data.. + if (data[1] == 0) { + data[1] = (_num_desktops + _num_desktops % data[2]) / data[2]; + } else if (data[2] == 0) { + data[2] = (_num_desktops + _num_desktops % data[1]) / data[1]; + } + _layout.columns = data[1]; + _layout.rows = data[2]; + } + + // bounds checking + if (_layout.orientation == DesktopLayout::Horizontal) { + if (_layout.rows > _num_desktops) _layout.rows = _num_desktops; + if (_layout.columns > (_num_desktops + _num_desktops % _layout.rows) / + _layout.rows) + _layout.columns = (_num_desktops + _num_desktops % _layout.rows) / + _layout.rows; + } else { + if (_layout.columns > _num_desktops) _layout.columns = _num_desktops; + if (_layout.rows > (_num_desktops + _num_desktops % _layout.columns) / + _layout.columns) + _layout.rows = (_num_desktops + _num_desktops % _layout.columns) / + _layout.columns; + } + } + delete [] data; + } +} void Screen::updateStruts() { @@ -217,16 +278,16 @@ void Screen::updateStruts() ClientList::const_iterator it, end = clients.end(); for (it = clients.begin(); it != end; ++it) { - long desk = (*it)->desktop(); + if ((*it)->iconic()) continue; // these dont count in the strut + + unsigned int desk = (*it)->desktop(); const otk::Strut &s = (*it)->strut(); - if (desk == (signed) 0xffffffff) + if (desk == 0xffffffff) for (unsigned int i = 0, e = _struts.size(); i < e; ++i) apply(_struts[i], s); - else if ((unsigned)desk < _struts.size()) + else if (desk < _struts.size()) apply(_struts[desk], s); - else if (desk == Client::ICONIC_DESKTOP) - continue; // skip for the 'all desktops' strut else assert(false); // invalid desktop otherwise.. // apply to the 'all desktops' strut @@ -239,7 +300,7 @@ void Screen::updateStruts() void Screen::changeWorkArea() { unsigned long *dims = new unsigned long[4 * _num_desktops]; - for (long i = 0; i < _num_desktops + 1; ++i) { + for (unsigned int i = 0; i < _num_desktops + 1; ++i) { otk::Rect old_area = _area[i]; /* #ifdef XINERAMA @@ -286,7 +347,7 @@ void Screen::changeWorkArea() (*it)->remaximize(); } else { // the 'all desktops' size - if ((*it)->desktop() == (signed) 0xffffffff) + if ((*it)->desktop() == 0xffffffff) (*it)->remaximize(); } } @@ -537,11 +598,7 @@ void Screen::manageWindow(Window window) EventData ddata(_number, client, EventAction::DisplayingWindow, 0); openbox->bindings()->fireEvent(&ddata); - // if on the current desktop.. (or all desktops) - if (client->desktop() == _desktop || - client->desktop() == (signed)0xffffffff) { - client->frame->show(); - } + client->showhide(); client->applyStartupState(); @@ -688,9 +745,6 @@ void Screen::raiseWindow(Client *client) const ClientList::iterator end = _stacking.end(); // the stacking list is from highest to lowest -// for (;it != end, ++it) { -// if ((*it)->layer() <= client->layer() && m != *it) break; -// } for (; it != end && ((*it)->layer() > client->layer() || m == *it); ++it); /* @@ -708,13 +762,13 @@ void Screen::raiseWindow(Client *client) changeStackingList(); } -void Screen::changeDesktop(long desktop) +void Screen::changeDesktop(unsigned int desktop) { - if (!(desktop >= 0 && desktop < _num_desktops)) return; + if (desktop >= _num_desktops) return; - printf("Moving to desktop %ld\n", desktop); + printf("Moving to desktop %u\n", desktop); - long old = _desktop; + unsigned int old = _desktop; _desktop = desktop; otk::Property::set(_info->rootWindow(), @@ -724,20 +778,15 @@ void Screen::changeDesktop(long desktop) if (old == _desktop) return; ClientList::iterator it, end = clients.end(); - for (it = clients.begin(); it != end; ++it) { - if ((*it)->desktop() == old) { - (*it)->frame->hide(); - } else if ((*it)->desktop() == _desktop) { - (*it)->frame->show(); - } - } + for (it = clients.begin(); it != end; ++it) + (*it)->showhide(); // force the callbacks to fire if (!openbox->focusedClient()) openbox->setFocusedClient(0); } -void Screen::changeNumDesktops(long num) +void Screen::changeNumDesktops(unsigned int num) { assert(num > 0); @@ -746,9 +795,8 @@ void Screen::changeNumDesktops(long num) // move windows on desktops that will no longer exist! ClientList::iterator it, end = clients.end(); for (it = clients.begin(); it != end; ++it) { - int d = (*it)->desktop(); - if (d >= num && !(d == (signed) 0xffffffff || - d == Client::ICONIC_DESKTOP)) { + unsigned int d = (*it)->desktop(); + if (d >= num && d != 0xffffffff) { XEvent ce; ce.xclient.type = ClientMessage; ce.xclient.message_type = otk::Property::atoms.net_wm_desktop; @@ -780,6 +828,9 @@ void Screen::changeNumDesktops(long num) _struts.resize(_num_desktops + 1); updateStruts(); + // the number of rows/columns will differ + updateDesktopLayout(); + // change our desktop if we're on one that no longer exists! if (_desktop >= _num_desktops) changeDesktop(_num_desktops - 1); @@ -794,15 +845,13 @@ void Screen::updateDesktopNames() otk::Property::atoms.net_desktop_names, otk::Property::utf8, &num, &_desktop_names)) _desktop_names.clear(); - while ((long)_desktop_names.size() < _num_desktops) + while (_desktop_names.size() < _num_desktops) _desktop_names.push_back("Unnamed"); } -void Screen::setDesktopName(long i, const otk::ustring &name) +void Screen::setDesktopName(unsigned int i, const otk::ustring &name) { - assert(i >= 0); - if (i >= _num_desktops) return; otk::Property::StringVect newnames = _desktop_names; @@ -813,10 +862,9 @@ void Screen::setDesktopName(long i, const otk::ustring &name) } -const otk::Rect& Screen::area(long desktop) const { - assert(desktop >= 0 || desktop == (signed) 0xffffffff); - assert(desktop < _num_desktops || desktop == (signed) 0xffffffff); - if (desktop >= 0 && desktop < _num_desktops) +const otk::Rect& Screen::area(unsigned int desktop) const { + assert(desktop < _num_desktops || desktop == 0xffffffff); + if (desktop < _num_desktops) return _area[desktop]; else return _area[_num_desktops]; @@ -849,6 +897,8 @@ void Screen::propertyHandler(const XPropertyEvent &e) if (e.atom == otk::Property::atoms.net_desktop_names) updateDesktopNames(); + else if (e.atom == otk::Property::atoms.net_desktop_layout) + updateDesktopLayout(); }