X-Git-Url: https://git.brokenzipper.com/gitweb?a=blobdiff_plain;f=src%2Fscreen.cc;h=dfcc8375d055613f2cfb6749f2e166ac5a252405;hb=f305e7f18dd9745e99518da7ca70183c3084a991;hp=a2514276d8cdb805081849e297cf835ba9f80282;hpb=4ef15148365c223b8e810611a10dc27dc5fba355;p=chaz%2Fopenbox diff --git a/src/screen.cc b/src/screen.cc index a2514276..dfcc8375 100644 --- a/src/screen.cc +++ b/src/screen.cc @@ -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() { @@ -684,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); /* @@ -770,6 +828,9 @@ void Screen::changeNumDesktops(unsigned int 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); @@ -836,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(); }