+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;
+ }
+}