all repos — openbox @ fef5d0d9bca56dfeec86ddf0867e64c908a1f97d

openbox fork - make it a bit more like ryudo

use rgba icons for clients
Dana Jansens danakj@orodu.net
commit

fef5d0d9bca56dfeec86ddf0867e64c908a1f97d

parent

c9c72cbe294b7924304a226f867686f3d05ff37a

3 files changed, 42 insertions(+), 11 deletions(-)

jump to
M engines/openbox/openbox.cengines/openbox/openbox.c

@@ -176,7 +176,7 @@ a_focused_title = appearance_new(Surface_Planar, 0);

a_unfocused_title = appearance_new(Surface_Planar, 0); a_focused_label = appearance_new(Surface_Planar, 1); a_unfocused_label = appearance_new(Surface_Planar, 1); - a_icon = appearance_new(Surface_Planar, 0);/*1);*/ + a_icon = appearance_new(Surface_Planar, 1); a_focused_handle = appearance_new(Surface_Planar, 0); a_unfocused_handle = appearance_new(Surface_Planar, 0);

@@ -790,8 +790,17 @@ static void render_icon(ObFrame *self)

{ if (self->icon_x < 0) return; - /* XXX set the texture's icon picture! */ - RECT_SET(self->a_icon->texture[0].position, 0, 0, BUTTON_SIZE,BUTTON_SIZE); + if (self->frame.client->nicons) { + Icon *icon = client_icon(self->frame.client, BUTTON_SIZE, BUTTON_SIZE); + self->a_icon->texture[0].type = RGBA; + self->a_icon->texture[0].data.rgba.width = icon->width; + self->a_icon->texture[0].data.rgba.height = icon->height; + self->a_icon->texture[0].data.rgba.data = icon->data; + RECT_SET(self->a_icon->texture[0].position, 0, 0, + BUTTON_SIZE,BUTTON_SIZE); + } else + self->a_icon->texture[0].type = NoTexture; + paint(self->icon, self->a_icon, 0, 0, BUTTON_SIZE, BUTTON_SIZE); }
M openbox/client.copenbox/client.c

@@ -1115,8 +1115,8 @@

/* store the icons */ i = 0; for (j = 0; j < self->nicons; ++j) { - w = self->icons[j].w = data[i++]; - h = self->icons[j].h = data[i++]; + w = self->icons[j].width = data[i++]; + h = self->icons[j].height = data[i++]; self->icons[j].data = g_memdup(&data[i], w * h * sizeof(gulong)); i += w * h;

@@ -1124,11 +1124,6 @@ g_assert(i <= num);

} g_free(data); - } - - if (self->nicons <= 0) { - self->nicons = 1; - self->icons = g_new0(Icon, 1); } if (self->frame)

@@ -1988,3 +1983,28 @@ client_calc_layer(self);

engine_frame_adjust_focus(self->frame); } + +Icon *client_icon(Client *self, int w, int h) +{ + int i; + /* si is the smallest image >= req */ + /* li is the largest image < req */ + unsigned long size, smallest = 0xffffffff, largest = 0, si = 0, li = 0; + + if (!self->nicons) return NULL; + + for (i = 0; i < self->nicons; ++i) { + size = self->icons[i].width * self->icons[i].height; + if (size < smallest && size >= (unsigned)(w * h)) { + smallest = size; + si = i; + } + if (size > largest && size <= (unsigned)(w * h)) { + largest = size; + li = i; + } + } + if (largest == 0) /* didnt find one smaller than the requested size */ + return &self->icons[si]; + return &self->icons[li]; +}
M openbox/client.hopenbox/client.h

@@ -11,7 +11,7 @@

/*! Holds an icon in ARGB format */ typedef struct Icon { - unsigned long w, h; + unsigned long width, height; unsigned long *data; } Icon;

@@ -456,5 +456,7 @@ void client_setup_decor_and_functions(Client *self);

/*! Retrieves the window's type and sets Client->type */ void client_get_type(Client *self); + +Icon *client_icon(Client *self, int w, int h); #endif