From d213d13784e44ee05b6f717ff9395b47736f43dd Mon Sep 17 00:00:00 2001 From: Martin Duquesnoy Date: Wed, 23 Feb 2011 15:15:31 +0100 Subject: [PATCH] Barwin/Frame: Optimization of saikobee feature --- src/barwin.c | 29 ++++++++++++++++++++------ src/client.c | 16 ++------------- src/frame.c | 57 +++++++++++++++++++++++++++++++++++++++++++-------- src/infobar.c | 3 ++- src/layout.c | 2 ++ src/structs.h | 1 + src/wmfs.h | 2 ++ 7 files changed, 81 insertions(+), 29 deletions(-) diff --git a/src/barwin.c b/src/barwin.c index 49f7eb8..2898dc9 100644 --- a/src/barwin.c +++ b/src/barwin.c @@ -81,6 +81,8 @@ barwin_create(Window parent, if(border) { bw->bord = True; + bw->border.light = color_shade(bg, conf.colors.bar_light_shade); + bw->border.dark = color_shade(bg, conf.colors.bar_dark_shade); CWIN(bw->border.left, bw->win, 0, 0, SHADH, h, 0, CWBackPixel, bg, &at); CWIN(bw->border.top, bw->win, 0, 0, w, SHADH, 0, CWBackPixel, bg, &at); @@ -95,8 +97,6 @@ barwin_create(Window parent, bw->geo.height = h; bw->bg = bg; bw->fg = fg; - bw->border.light = color_shade(bg, conf.colors.bar_light_shade); - bw->border.dark = color_shade(bg, conf.colors.bar_dark_shade); bw->stipple = stipple; bw->stipple_color = -1; @@ -143,6 +143,23 @@ barwin_draw_image_ofset_text(BarWindow *bw, int x, int y, char *text, int x_imag return; } +void +barwin_color_set(BarWindow *bw, uint bg, char *fg) +{ + CHECK(bw); + + bw->bg = bg; + bw->fg = fg; + + if(bw->bord) + { + bw->border.light = color_shade(bg, conf.colors.bar_light_shade); + bw->border.dark = color_shade(bg, conf.colors.bar_dark_shade); + } + + return; +} + /** Delete a BarWindow * \param bw BarWindow pointer */ @@ -299,10 +316,10 @@ barwin_refresh_color(BarWindow *bw) if(bw->bord) { - XSetWindowBackground(dpy, bw->border.left, color_shade(bw->bg, conf.colors.bar_light_shade)); - XSetWindowBackground(dpy, bw->border.top, color_shade(bw->bg, conf.colors.bar_light_shade)); - XSetWindowBackground(dpy, bw->border.bottom, color_shade(bw->bg, conf.colors.bar_dark_shade)); - XSetWindowBackground(dpy, bw->border.right, color_shade(bw->bg, conf.colors.bar_dark_shade)); + XSetWindowBackground(dpy, bw->border.left, bw->border.light); + XSetWindowBackground(dpy, bw->border.top, bw->border.light); + XSetWindowBackground(dpy, bw->border.bottom, bw->border.dark); + XSetWindowBackground(dpy, bw->border.right, bw->border.dark); XClearWindow(dpy, bw->border.left); XClearWindow(dpy, bw->border.top); diff --git a/src/client.c b/src/client.c index 96b588c..c576077 100644 --- a/src/client.c +++ b/src/client.c @@ -360,19 +360,13 @@ client_focus(Client *c) if(sel && sel != c) { - sel->colors.frame = conf.client.bordernormal; - sel->colors.fg = conf.titlebar.fg_normal; - sel->colors.resizecorner = conf.client.resizecorner_normal; - - if(TBARH - BORDH && sel->titlebar->stipple) - sel->titlebar->stipple_color = conf.titlebar.stipple.colors.normal; - if(sel->flags & AboveFlag) sel->flags &= ~AboveFlag; XChangeProperty(dpy, sel->frame, net_atom[net_wm_window_opacity], XA_CARDINAL, 32, PropModeReplace, (uchar *)&conf.opacity, 1); + frame_update_color(sel, True); frame_update(sel); mouse_grabbuttons(sel, !conf.focus_pclick); @@ -380,10 +374,6 @@ client_focus(Client *c) if((sel = c)) { - c->colors.frame = conf.client.borderfocus; - c->colors.fg = conf.titlebar.fg_focus; - c->colors.resizecorner = conf.client.resizecorner_focus; - /* Set focusontag option */ for(cc = clients; cc; cc = cc->next) if(cc->focusontag == (int)c->tag) @@ -391,11 +381,9 @@ client_focus(Client *c) c->focusontag = seltag[selscreen]; - if(TBARH - BORDH && c->titlebar->stipple) - c->titlebar->stipple_color = conf.titlebar.stipple.colors.focus; - XDeleteProperty(dpy, c->frame, net_atom[net_wm_window_opacity]); + frame_update_color(c, False); frame_update(c); mouse_grabbuttons(c, True); diff --git a/src/frame.c b/src/frame.c index 22d7ff8..6481eb8 100644 --- a/src/frame.c +++ b/src/frame.c @@ -118,10 +118,13 @@ frame_create(Client *c) /* Border (for shadow) */ if(conf.client.border_shadow) { - CWIN(c->left, c->frame, 0, 0, SHADH, c->frame_geo.height, 0, CWBackPixel, c->colors.frame, &at); - CWIN(c->top, c->frame, 0, 0, c->frame_geo.width, SHADH, 0, CWBackPixel, c->colors.frame, &at); - CWIN(c->bottom, c->frame, 0, c->frame_geo.height - SHADH, c->frame_geo.width, SHADH, 0, CWBackPixel, c->colors.frame, &at); - CWIN(c->right, c->frame, c->frame_geo.width - SHADH, 0, SHADH, c->frame_geo.height, 0, CWBackPixel, c->colors.frame, &at); + c->colors.borddark = color_shade(c->colors.frame, conf.colors.client_dark_shade); + c->colors.bordlight = color_shade(c->colors.frame, conf.colors.client_light_shade); + + CWIN(c->left, c->frame, 0, 0, SHADH, c->frame_geo.height, 0, CWBackPixel, c->colors.bordlight, &at); + CWIN(c->top, c->frame, 0, 0, c->frame_geo.width, SHADH, 0, CWBackPixel, c->colors.bordlight, &at); + CWIN(c->bottom, c->frame, 0, c->frame_geo.height - SHADH, c->frame_geo.width, SHADH, 0, CWBackPixel, c->colors.borddark, &at); + CWIN(c->right, c->frame, c->frame_geo.width - SHADH, 0, SHADH, c->frame_geo.height, 0, CWBackPixel, c->colors.borddark, &at); } /* Reparent window with the frame */ @@ -191,6 +194,44 @@ frame_moveresize(Client *c, XRectangle geo) return; } +/** Update frame colors for focus event + *\param c Client pointer +*/ +void +frame_update_color(Client *c, Bool focused) +{ + CHECK(c); + + /* Not focused client */ + if(focused) + { + c->colors.frame = conf.client.bordernormal; + c->colors.fg = conf.titlebar.fg_normal; + c->colors.resizecorner = conf.client.resizecorner_normal; + + if(TBARH - BORDH && c->titlebar->stipple) + c->titlebar->stipple_color = conf.titlebar.stipple.colors.normal; + } + /* Focused */ + else + { + c->colors.frame = conf.client.borderfocus; + c->colors.fg = conf.titlebar.fg_focus; + c->colors.resizecorner = conf.client.resizecorner_focus; + + if(TBARH - BORDH && c->titlebar->stipple) + c->titlebar->stipple_color = conf.titlebar.stipple.colors.focus; + } + + if(conf.client.border_shadow) + { + c->colors.borddark = color_shade(c->colors.frame, conf.colors.client_dark_shade); + c->colors.bordlight = color_shade(c->colors.frame, conf.colors.client_light_shade); + } + + return; +} + /** Update the client frame; Set the new color * and the title --> refresh * \param c Client pointer @@ -258,10 +299,10 @@ frame_update(Client *c) if(conf.client.border_shadow) { - XSetWindowBackground(dpy, c->left, color_shade(c->colors.frame, conf.colors.client_light_shade)); - XSetWindowBackground(dpy, c->top, color_shade(c->colors.frame, conf.colors.client_light_shade)); - XSetWindowBackground(dpy, c->right, color_shade(c->colors.frame, conf.colors.client_dark_shade)); - XSetWindowBackground(dpy, c->bottom, color_shade(c->colors.frame, conf.colors.client_dark_shade)); + XSetWindowBackground(dpy, c->left, c->colors.bordlight); + XSetWindowBackground(dpy, c->top, c->colors.bordlight); + XSetWindowBackground(dpy, c->right, c->colors.borddark); + XSetWindowBackground(dpy, c->bottom, c->colors.borddark); XClearWindow(dpy, c->left); XClearWindow(dpy, c->top); diff --git a/src/infobar.c b/src/infobar.c index d3a1306..2650b3e 100644 --- a/src/infobar.c +++ b/src/infobar.c @@ -272,6 +272,7 @@ infobar_draw_taglist(int sc) ? conf.colors.tag_occupied_fg : conf.colors.text)); + barwin_color_set(infobar[sc].tags[i], infobar[sc].tags[i]->bg, infobar[sc].tags[i]->fg); barwin_refresh_color(infobar[sc].tags[i]); if(tags[sc][i].name) @@ -417,7 +418,7 @@ uicb_infobar_toggledisplay(uicb_t cmd) ? 0 : (tags[selscreen][seltag[selscreen]].prev_barpos ? tags[selscreen][seltag[selscreen]].prev_barpos : 2 )); - + tags[selscreen][seltag[selscreen]].prev_barpos = tags[selscreen][seltag[selscreen]].barpos; tags[selscreen][seltag[selscreen]].barpos = new_pos; diff --git a/src/layout.c b/src/layout.c index 9f9ed13..71336aa 100644 --- a/src/layout.c +++ b/src/layout.c @@ -748,7 +748,9 @@ uicb_togglemax(uicb_t cmd) sel->free_geo = sel->geo; sel->flags &= ~(TileFlag | FreeFlag); client_maximize(sel); + XRaiseWindow(dpy, sel->frame); sel->flags |= MaxFlag; + } else { diff --git a/src/structs.h b/src/structs.h index cf540f2..0100c1f 100644 --- a/src/structs.h +++ b/src/structs.h @@ -216,6 +216,7 @@ struct Client uint frame; char *fg; uint resizecorner; + uint bordlight, borddark; } colors; /* Client Information by flags */ uint flags; diff --git a/src/wmfs.h b/src/wmfs.h index 46b6c47..6c6944e 100644 --- a/src/wmfs.h +++ b/src/wmfs.h @@ -120,6 +120,7 @@ BarWindow *barwin_create(Window parent, Bool border); void barwin_draw_text(BarWindow *bw, int x, int y, char *text); void barwin_draw_image_ofset_text(BarWindow *bw, int x, int y, char *text, int x_image_ofset, int y_image_ofset); +void barwin_color_set(BarWindow *bw, uint bg, char *fg); void barwin_delete(BarWindow *bw); void barwin_delete_subwin(BarWindow *bw); void barwin_map(BarWindow *bw); @@ -227,6 +228,7 @@ void ewmh_manage_window_type(Client *c); void frame_create(Client *c); void frame_delete(Client *c); void frame_moveresize(Client *c, XRectangle geo); +void frame_update_color(Client *c, Bool focused); void frame_update(Client *c); /* config.c */