summaryrefslogtreecommitdiff
path: root/openbox
diff options
context:
space:
mode:
authorMikael Magnusson <mikachu@comhem.se>2007-09-02 14:52:39 +0200
committerDana Jansens <danakj@orodu.net>2008-02-03 00:28:02 -0500
commitd35dd5ce74bb1e6aadf8047be5b80324b0db37ed (patch)
treeb2b33e04bb819d05d2e9ad519fec1f957d85b54f /openbox
parent23cbab843592f35fba74034539f3213ae5d1b7c9 (diff)
Draw the hilite texture with the icon appearance instead of the background.
This means we don't have to redraw the whole background every time. However, the hilite is now a bit too small (or the icon is a bit too big).
Diffstat (limited to 'openbox')
-rw-r--r--openbox/focus_cycle_popup.c56
1 files changed, 27 insertions, 29 deletions
diff --git a/openbox/focus_cycle_popup.c b/openbox/focus_cycle_popup.c
index b98ebc17..f39483a2 100644
--- a/openbox/focus_cycle_popup.c
+++ b/openbox/focus_cycle_popup.c
@@ -100,15 +100,14 @@ void focus_cycle_popup_startup(gboolean reconfig)
popup.obwin.type = OB_WINDOW_CLASS_INTERNAL;
popup.a_bg = RrAppearanceCopy(ob_rr_theme->osd_hilite_bg);
popup.a_text = RrAppearanceCopy(ob_rr_theme->osd_hilite_label);
- popup.a_icon = RrAppearanceCopy(ob_rr_theme->a_clear_tex);
+ popup.a_icon = RrAppearanceCopy(ob_rr_theme->a_clear);
popup.a_text->surface.parent = popup.a_bg;
popup.a_icon->surface.parent = popup.a_bg;
- popup.a_icon->texture[0].type = RR_TEXTURE_RGBA;
+ RrAppearanceAddTextures(popup.a_icon, 2);
- RrAppearanceAddTextures(popup.a_bg, 1);
- popup.a_bg->texture[0].type = RR_TEXTURE_RGBA;
+ popup.a_icon->texture[1].type = RR_TEXTURE_RGBA;
attrib.override_redirect = True;
attrib.border_pixel=RrColorPixel(ob_rr_theme->osd_border_color);
@@ -267,6 +266,7 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c)
w = MAX(w, POPUP_WIDTH); /* min width */
/* find the height of the dialog */
+#warning limit the height and scroll entries somehow
h = t + b + (p->n_targets * ICON_SIZE) + OUTSIDE_BORDER;
/* find the position for the popup (include the outer borders) */
@@ -285,12 +285,12 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c)
/* position the background but don't draw it*/
XMoveResizeWindow(obt_display, p->bg, x, y, w, h);
- /* set up the hilite texture for the background */
- p->a_bg->texture[0].data.rgba.width = rgbaw;
- p->a_bg->texture[0].data.rgba.height = rgbah;
- p->a_bg->texture[0].data.rgba.alpha = 0xff;
- p->hilite_rgba = g_new(RrPixel32, rgbaw * rgbah);
- p->a_bg->texture[0].data.rgba.data = p->hilite_rgba;
+ /* set up the hilite texture for the icon */
+ p->a_icon->texture[0].data.rgba.width = ICON_SIZE;
+ p->a_icon->texture[0].data.rgba.height = ICON_SIZE;
+ p->a_icon->texture[0].data.rgba.alpha = 0xff;
+ p->hilite_rgba = g_new(RrPixel32, ICON_SIZE * ICON_SIZE);
+ p->a_icon->texture[0].data.rgba.data = p->hilite_rgba;
}
/* find the focused target */
@@ -320,22 +320,14 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c)
((ob_rr_theme->osd_color->b & 0xff) << RrDefaultBlueOffset);
o = 0;
- for (i = 0; i < rgbah; ++i)
- for (j = 0; j < rgbaw; ++j) {
+ for (x = 0; x < ICON_SIZE; x++)
+ for (y = 0; y < ICON_SIZE; y++) {
guchar a;
- const gint x = j + rgbax - newtargetx;
- const gint y = i + rgbay - newtargety;
- if (x < 0 || x >= ICON_SIZE ||
- y < 0 || y >= ICON_SIZE)
- {
- /* outside the target */
- a = 0x00;
- }
- else if (x < ICON_HILITE_WIDTH ||
- x >= ICON_SIZE - ICON_HILITE_WIDTH ||
- y < ICON_HILITE_WIDTH ||
- y >= ICON_SIZE - ICON_HILITE_WIDTH)
+ if (x < ICON_HILITE_WIDTH ||
+ x >= ICON_SIZE - ICON_HILITE_WIDTH ||
+ y < ICON_HILITE_WIDTH ||
+ y >= ICON_SIZE - ICON_HILITE_WIDTH)
{
/* the border of the target */
a = 0x88;
@@ -353,7 +345,8 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c)
/* * * draw everything * * */
/* draw the background */
- RrPaint(p->a_bg, p->bg, w, h);
+ if (!p->mapped)
+ RrPaint(p->a_bg, p->bg, w, h);
/* draw the icons and text */
for (i = 0, it = p->targets; it; ++i, it = g_list_next(it)) {
@@ -382,11 +375,16 @@ static void popup_render(ObFocusCyclePopup *p, const ObClient *c)
/* 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 =
+ p->a_icon->texture[1].data.rgba.width = icon->width;
+ p->a_icon->texture[1].data.rgba.height = icon->height;
+ p->a_icon->texture[1].data.rgba.alpha =
target->client->iconic ? OB_ICONIC_ALPHA : 0xff;
- p->a_icon->texture[0].data.rgba.data = icon->data;
+ p->a_icon->texture[1].data.rgba.data = icon->data;
+
+ /* Draw the hilite? */
+#warning do i have to add more obrender interface thingers to get it to draw the icon inside the hilight? sigh
+ p->a_icon->texture[0].type = (target == newtarget) ?
+ RR_TEXTURE_RGBA : RR_TEXTURE_NONE;
/* draw the icon */
p->a_icon->surface.parentx = innerx;