+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);
+ }
+
+ delete [] data;
+ }
+
+ if (_nicons <= 0) {
+ _nicons = 1;
+ _icons = new Icon[1];
+ _icons[i].w = 0;
+ _icons[i].h = 0;
+ _icons[i].data = 0;
+ }
+
+ assert(_nicons > 0); // there should always be a default..
+
+ if (frame) frame->adjustIcon();
+}
+
+void Client::updateKwmIcon()
+{
+ _pixmap_icon = _pixmap_icon_mask = None;
+
+ unsigned long num = 2;
+ Pixmap *data;
+ if (otk::Property::get(_window, otk::Property::atoms.kwm_win_icon,
+ otk::Property::atoms.kwm_win_icon, &num, &data)) {
+ if (num == 2) {
+ _pixmap_icon = data[0];
+ _pixmap_icon_mask = data[1];
+ }
+ delete [] data;
+ }
+}