look, thumbnails in alt-tab. its such crap though. oh well, just for fun.

This commit is contained in:
Dana Jansens 2007-06-21 16:20:43 +00:00
parent d158b64282
commit 19ecd4d6d4
3 changed files with 48 additions and 6 deletions

View 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);
}
}

View 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

View 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);
}
}