+ }
+}
+
+void Client::updateIcons()
+{
+ unsigned long num;
+ unsigned long *data;
+ unsigned long w, h, i = 0;
+
+ for (int j = 0; j < _nicons; ++j)
+ delete [] _icons[j].data;
+ if (_nicons > 0)
+ delete [] _icons;
+ _nicons = 0;
+
+ if (otk::Property::get(_window, otk::Property::atoms.net_wm_icon,
+ otk::Property::atoms.cardinal, &num, &data)) {
+ // figure out how man valid icons are in here
+ while (num - i > 2) {
+ w = data[i++];
+ h = data[i++];
+ i += w * h;
+ if (i > num) break;
+ ++_nicons;
+ }
+
+ _icons = new Icon[_nicons];
+
+ // store the icons
+ i = 0;
+ for (int j = 0; j < _nicons; ++j) {
+ w = _icons[j].w = data[i++];
+ h = _icons[j].h = data[i++];
+ _icons[j].data = new unsigned long[w * h];
+ ::memcpy(_icons[j].data, &data[i], w * h * sizeof(unsigned long));
+ i += w * h;
+ assert(i <= num);
+ }