X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=spectrwm.c;h=331dabccf945d404a294dc940efe4b16607e979c;hb=2505c8c112ee33308b6cbc22b5406c1fa23ddfe1;hp=cd629162ddc6f3ba210d05e9829b9ae4b7577594;hpb=78294264814075f867420d88e406593dab73dc75;p=spectrwm.git diff --git a/spectrwm.c b/spectrwm.c index cd62916..331dabc 100644 --- a/spectrwm.c +++ b/spectrwm.c @@ -353,6 +353,7 @@ time_t time_started; pid_t bar_pid; XftFont *bar_font; char *bar_fonts; +XftColor bar_font_color; struct passwd *pwd; /* layout manager data */ @@ -657,6 +658,9 @@ void spawn_select(struct swm_region *, union arg *, char *, int *); void store_float_geom(struct ws_win *, struct swm_region *); void unmanage_window(struct ws_win *); void update_window(struct ws_win *); +#ifdef SWM_DEBUG +char *get_atom_name(xcb_atom_t); +#endif /* function definitions */ xcb_char2b_t * @@ -957,6 +961,9 @@ ewmh_update_win_state(struct ws_win *win, long state, long action) if (win == NULL) return; + DNPRINTF(SWM_D_PROP, "ewmh_update_win_state: window: 0x%x, state: %ld, " + "action: %ld\n", win->id, state, action); + if (state == ewmh[_NET_WM_STATE_FULLSCREEN].atom) mask = EWMH_F_FULLSCREEN; if (state == ewmh[_NET_WM_STATE_ABOVE].atom) @@ -1341,6 +1348,7 @@ bar_print(struct swm_region *r, const char *s) uint32_t gcv[1]; int32_t x; XGlyphInfo info; + XftDraw *draw; len = strlen(s); @@ -1378,8 +1386,14 @@ bar_print(struct swm_region *r, const char *s) gcv[0] = r->s->c[SWM_S_COLOR_BAR_FONT].color; xcb_change_gc(conn, r->s->bar_gc, XCB_GC_FOREGROUND, gcv); - xcb_image_text_8(conn, len, r->bar->buffer, r->s->bar_gc, x, - bar_font->height, s); + draw = XftDrawCreate(display, r->bar->buffer, + DefaultVisual(display, r->s->idx), + DefaultColormap(display, r->s->idx)); + + XftDrawStringUtf8(draw, &bar_font_color, bar_font, x, + bar_font->height, (FcChar8 *)s, len); + + XftDrawDestroy(draw); /* blt */ xcb_copy_area(conn, r->bar->buffer, r->bar->id, r->s->bar_gc, 0, 0, @@ -1844,8 +1858,11 @@ bar_setup(struct swm_region *r) char *font; xcb_screen_t *screen = get_screen(r->s->idx); uint32_t wa[3]; - + XRenderColor color; + if (bar_font) { + XftColorFree(display, DefaultVisual(display, r->s->idx), + DefaultColormap(display, r->s->idx), &bar_font_color); XftFontClose(display, bar_font); bar_font = NULL; } @@ -1858,7 +1875,7 @@ bar_setup(struct swm_region *r) continue; DNPRINTF(SWM_D_INIT, "bar_setup: try font %s\n", font); - bar_font = XftFontOpenName(display, DefaultScreen(display), + bar_font = XftFontOpenName(display, r->s->idx, font); if (!bar_font) { warnx("unable to load font %s", font); @@ -1869,12 +1886,23 @@ bar_setup(struct swm_region *r) break; } } + if (bar_font == NULL) + errx(1, "unable to open a font"); bar_height = bar_font->height + 4 * bar_border_width; if (bar_height < 1) bar_height = 1; + color.alpha = 0xffff; + color.red = (r->s->c[SWM_S_COLOR_BAR_FONT].color >> 16) & 0xffff; + color.green = (r->s->c[SWM_S_COLOR_BAR_FONT].color >> 8) & 0xffff; + color.blue = r->s->c[SWM_S_COLOR_BAR_FONT].color & 0xffff; + if (!XftColorAllocValue(display, DefaultVisual(display, r->s->idx), + DefaultColormap(display, r->s->idx), &color, + &bar_font_color)) + warn("unable to allocate Xft color"); + X(r->bar) = X(r); Y(r->bar) = bar_at_bottom ? (Y(r) + HEIGHT(r) - bar_height) : Y(r); WIDTH(r->bar) = WIDTH(r) - 2 * bar_border_width; @@ -2100,14 +2128,16 @@ quit(struct swm_region *r, union arg *args) void unmap_window(struct ws_win *win) { + DNPRINTF(SWM_D_EVENT, "unmap_window: window: 0x%x\n", win->id); + if (win == NULL) return; /* don't unmap again */ - if (getstate(win->id) == XCB_ICCCM_WM_STATE_ICONIC) + if (getstate(win->id) == XCB_ICCCM_WM_STATE_WITHDRAWN) return; - set_win_state(win, XCB_ICCCM_WM_STATE_ICONIC); + set_win_state(win, XCB_ICCCM_WM_STATE_WITHDRAWN); xcb_unmap_window(conn, win->id); xcb_change_window_attributes(conn, win->id, @@ -2177,6 +2207,9 @@ restart(struct swm_region *r, union arg *args) bar_extra = 1; unmap_all(); + XftFontClose(display, bar_font); + XftColorFree(display, DefaultVisual(display, r->s->idx), + DefaultColormap(display, r->s->idx), &bar_font_color); xcb_key_symbols_free(syms); xcb_flush(conn); xcb_disconnect(conn); @@ -2586,6 +2619,8 @@ switchws(struct swm_region *r, union arg *args) event_drain(XCB_ENTER_NOTIFY); else xcb_flush(conn); + + DNPRINTF(SWM_D_WS, "switchws: done\n"); } void @@ -7813,9 +7848,10 @@ done: for (i = 0; i < num_screens; ++i) if (screens[i].bar_gc != 0) xcb_free_gc(conn, screens[i].bar_gc); -#if 0 - XFreeFontSet(display, bar_font); -#endif + + XftFontClose(display, bar_font); + XftColorFree(display, DefaultVisual(display, 0), + DefaultColormap(display, 0), &bar_font_color); xcb_key_symbols_free(syms); xcb_flush(conn); xcb_disconnect(conn);