look, thumbnails in alt-tab. its such crap though. oh well, just for fun.
This commit is contained in:
parent
d158b64282
commit
19ecd4d6d4
3 changed files with 48 additions and 6 deletions
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 */
|
||||||
|
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);
|
icon = client_icon(target->client, innerw, innerh);
|
||||||
p->a_icon->texture[0].data.rgba.width = icon->width;
|
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.height = icon->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 = 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue