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; 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); 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 /*! 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 FALSE if it's not transient or there is no window for it to be
transient for */ transient for */
@ -695,4 +697,6 @@ ObClient* client_under_pointer();
gboolean client_has_group_siblings(ObClient *self); gboolean client_has_group_siblings(ObClient *self);
void clienticon_free(ObClientIcon *ci);
#endif #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 */ they can pick up the hilite changes in the backgroud */
if (!p->mapped || newtarget == target || p->last_target == target) { if (!p->mapped || newtarget == target || p->last_target == target) {
const ObClientIcon *icon; const ObClientIcon *icon;
ObClientIcon *thumb;
const gint row = i / icons_per_row; /* starting from 0 */ const gint row = i / icons_per_row; /* starting from 0 */
const gint col = i % icons_per_row; /* starting from 0 */ const gint col = i % icons_per_row; /* starting from 0 */
gint innerx, innery; gint innerx, innery;
@ -412,17 +413,27 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c)
innerx, innery, innerw, innerh); innerx, innery, innerw, innerh);
/* get the icon from the client */ /* get the icon from the client */
icon = client_icon(target->client, innerw, innerh); if ((thumb = client_thumbnail(target->client))) {
p->a_icon->texture[0].data.rgba.width = icon->width; p->a_icon->texture[0].data.rgba.width = thumb->width;
p->a_icon->texture[0].data.rgba.height = icon->height; p->a_icon->texture[0].data.rgba.height = thumb->height;
p->a_icon->texture[0].data.rgba.alpha = p->a_icon->texture[0].data.rgba.alpha =
target->client->iconic ? OB_ICONIC_ALPHA : 0xff; target->client->iconic ? OB_ICONIC_ALPHA : 0xff;
p->a_icon->texture[0].data.rgba.data = icon->data; 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 */ /* draw the icon */
p->a_icon->surface.parentx = innerx; p->a_icon->surface.parentx = innerx;
p->a_icon->surface.parenty = innery; p->a_icon->surface.parenty = innery;
RrPaint(p->a_icon, target->win, innerw, innerh); RrPaint(p->a_icon, target->win, innerw, innerh);
clienticon_free(thumb);
} }
} }