]> Dogcows Code - chaz/openbox/commitdiff
look, thumbnails in alt-tab. its such crap though. oh well, just for fun.
authorDana Jansens <danakj@orodu.net>
Thu, 21 Jun 2007 16:20:43 +0000 (16:20 +0000)
committerDana Jansens <danakj@orodu.net>
Thu, 21 Jun 2007 16:20:43 +0000 (16:20 +0000)
openbox/client.c
openbox/client.h
openbox/focus_cycle_popup.c

index cf6965ae24ade67a84338309fe434ebad6d9d0fe..771294a4b3081897fc9db34da889040ae33c7e5a 100644 (file)
@@ -4083,3 +4083,30 @@ gboolean client_has_group_siblings(ObClient *self)
 {
     return self->group && self->group->members->next;
 }
+
+ObClientIcon *client_thumbnail(ObClient *self, gint wantw, gint wanth)
+{
+    ObClientIcon *ret;
+    RrPixel32 *data;
+    gint w, h;
+
+    if (!self->frame->pixmap) return NULL;
+    if (!RrPixmapToRGBA(ob_rr_inst, self->frame->pixmap, None, &w, &h, &data))
+        return NULL;
+
+    /* resize the thumbnail (within aspect ratio) to the given sizes */
+
+    ret = g_new(ObClientIcon, 1);
+    ret->data = data;
+    ret->width = w;
+    ret->height = h;
+    return ret;
+}
+
+void clienticon_free(ObClientIcon *ci)
+{
+    if (ci) {
+        g_free(ci->data);
+        g_free(ci);
+    }
+}
index ed6779264454bdca6e9c82ea5d662ae21f0bba3b..b30db198af8ea42665cc31ddcc9256756d20af6d 100644 (file)
@@ -611,6 +611,8 @@ void client_get_type_and_transientness(ObClient *self);
 
 const ObClientIcon *client_icon(ObClient *self, gint w, gint h);
 
+ObClientIcon *client_thumbnail(ObClient *self, gint w, gint h);
+
 /*! Return TRUE if the client is transient for some other window. Return
   FALSE if it's not transient or there is no window for it to be
   transient for */
@@ -695,4 +697,6 @@ ObClient* client_under_pointer();
 
 gboolean client_has_group_siblings(ObClient *self);
 
+void clienticon_free(ObClientIcon *ci);
+
 #endif
index 477619f557c37afc448cc2abba1961cbb2d9672a..595fb9df752488caa76a0556787bf5880aaf0ec9 100644 (file)
@@ -397,6 +397,7 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c)
            they can pick up the hilite changes in the backgroud */
         if (!p->mapped || newtarget == target || p->last_target == target) {
             const ObClientIcon *icon;
+            ObClientIcon *thumb;
             const gint row = i / icons_per_row; /* starting from 0 */
             const gint col = i % icons_per_row; /* starting from 0 */
             gint innerx, innery;
@@ -412,17 +413,27 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c)
                               innerx, innery, innerw, innerh);
 
             /* get the icon from the client */
-            icon = client_icon(target->client, innerw, innerh);
-            p->a_icon->texture[0].data.rgba.width = icon->width;
-            p->a_icon->texture[0].data.rgba.height = icon->height;
-            p->a_icon->texture[0].data.rgba.alpha =
-                target->client->iconic ? OB_ICONIC_ALPHA : 0xff;
-            p->a_icon->texture[0].data.rgba.data = icon->data;
+            if ((thumb = client_thumbnail(target->client))) {
+                p->a_icon->texture[0].data.rgba.width = thumb->width;
+                p->a_icon->texture[0].data.rgba.height = thumb->height;
+                p->a_icon->texture[0].data.rgba.alpha =
+                    target->client->iconic ? OB_ICONIC_ALPHA : 0xff;
+                p->a_icon->texture[0].data.rgba.data = thumb->data;
+            } else {
+                icon = client_icon(target->client, innerw, innerh);
+                p->a_icon->texture[0].data.rgba.width = icon->width;
+                p->a_icon->texture[0].data.rgba.height = icon->height;
+                p->a_icon->texture[0].data.rgba.alpha =
+                    target->client->iconic ? OB_ICONIC_ALPHA : 0xff;
+                p->a_icon->texture[0].data.rgba.data = icon->data;
+            }
 
             /* draw the icon */
             p->a_icon->surface.parentx = innerx;
             p->a_icon->surface.parenty = innery;
             RrPaint(p->a_icon, target->win, innerw, innerh);
+
+            clienticon_free(thumb);
         }
     }
 
This page took 0.027342 seconds and 4 git commands to generate.