]> Dogcows Code - chaz/openbox/blobdiff - src/client.cc
support for pixmap icons, kwm_win_icon and the icon in wmhints
[chaz/openbox] / src / client.cc
index bd7f7b83c82a29b68302de4782088d7219f28f72..53a6d768eec94a2eeb2bbd94b0606d8a3a81a73a 100644 (file)
@@ -77,6 +77,7 @@ Client::Client(int screen, Window window)
   updateClass();
   updateStrut();
   updateIcons();
+  updateKwmIcon();
   
   // this makes sure that these windows appear on all desktops
   if (/*_type == Type_Dock ||*/ _type == Type_Desktop)
@@ -575,13 +576,24 @@ void Client::updateWMHints(bool initstate)
     } else // no group!
       _group = None;
 
+    if (hints->flags & IconPixmapHint) {
+      updateKwmIcon(); // try get the kwm icon first, this is a fallback only
+      if (_pixmap_icon == None) {
+        _pixmap_icon = hints->icon_pixmap;
+        if (hints->flags & IconMaskHint)
+          _pixmap_icon_mask = hints->icon_mask;
+        else
+          _pixmap_icon_mask = None;
+      }
+    }
+
     XFree(hints);
   }
 
   if (ur != _urgent) {
     _urgent = ur;
 #ifdef DEBUG
-    printf("DEBUG: Urgent Hint for 0x%lx: %s\n",
+    printf("Urgent Hint for 0x%lx: %s\n",
            (long)_window, _urgent ? "ON" : "OFF");
 #endif
     // fire the urgent callback if we're mapped, otherwise, wait until after
@@ -716,7 +728,7 @@ void Client::updateIcons()
   _nicons = 0;
 
   if (otk::Property::get(_window, otk::Property::atoms.net_wm_icon,
-                         otk::Property::atoms.cardinal, &num, &data)) {
+                          otk::Property::atoms.cardinal, &num, &data)) {
     // figure out how man valid icons are in here
     while (num - i > 2) {
       w = data[i++];
@@ -727,7 +739,7 @@ void Client::updateIcons()
     }
 
     _icons = new Icon[_nicons];
-
+    
     // store the icons
     i = 0;
     for (int j = 0; j < _nicons; ++j) {
@@ -738,12 +750,11 @@ void Client::updateIcons()
       i += w * h;
       assert(i <= num);
     }
-    
+
     delete [] data;
   }
 
   if (_nicons <= 0) {
-    // set the default icon(s) XXX load these from the py
     _nicons = 1;
     _icons = new Icon[1];
     _icons[i].w = 0;
@@ -756,6 +767,22 @@ void Client::updateIcons()
   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;
+  }
+}
+
 void Client::propertyHandler(const XPropertyEvent &e)
 {
   otk::EventHandler::propertyHandler(e);
@@ -801,6 +828,8 @@ void Client::propertyHandler(const XPropertyEvent &e)
     updateStrut();
   else if (e.atom == otk::Property::atoms.net_wm_icon)
     updateIcons();
+  else if (e.atom == otk::Property::atoms.kwm_win_icon)
+    updateKwmIcon();
 }
 
 void Client::setWMState(long state)
@@ -1231,9 +1260,9 @@ const Icon *Client::icon(const otk::Size &s) const
       li = i;
     }
   }
-  if (smallest == 0xffffffff) // didnt find one bigger than us...
-    return &_icons[li];
-  return &_icons[si];
+  if (largest == 0) // didnt find one smaller than the requested size
+    return &_icons[si];
+  return &_icons[li];
 }
 
 void Client::move(int x, int y)
@@ -1711,8 +1740,6 @@ bool Client::focus()
   // visible on the screen
   if (!(frame->visible() && (_can_focus || _focus_notify))) return false;
 
-  if (_focused) return true;
-
   // do a check to see if the window has already been unmapped or destroyed
   // do this intelligently while watching out for unmaps we've generated
   // (ignore_unmaps > 0)
@@ -1756,8 +1783,6 @@ bool Client::focus()
 
 void Client::unfocus() const
 {
-  if (!_focused) return;
-
   assert(openbox->focusedClient() == this);
   openbox->setFocusedClient(0);
 }
This page took 0.022842 seconds and 4 git commands to generate.