X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=spectrwm.c;h=67bd5ccfea534d8ce014afbff4b0ec73149c563c;hb=2daa570c173fef98aa7cd2bf90341d14c3695750;hp=cd629162ddc6f3ba210d05e9829b9ae4b7577594;hpb=78294264814075f867420d88e406593dab73dc75;p=spectrwm.git diff --git a/spectrwm.c b/spectrwm.c index cd62916..67bd5cc 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 * @@ -673,7 +677,7 @@ char2b(const char *str) for (i = 0; i < len; i++) { s[i].byte1 = '\0'; s[i].byte2 = str[i]; - } + } return (s); } @@ -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,8 +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), - font); + bar_font = XftFontOpenName(display, r->s->idx, font); if (!bar_font) { warnx("unable to load font %s", font); continue; @@ -1869,12 +1885,22 @@ 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; @@ -2067,7 +2093,7 @@ config_win(struct ws_win *win, xcb_configure_request_event_t *ev) ce.y, ce.width, ce.height, ce.border_width); xcb_send_event(conn, False, win->id, XCB_EVENT_MASK_STRUCTURE_NOTIFY, - (char *)&ce); + (char *)&ce); } int @@ -2100,14 +2126,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 +2205,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); @@ -2484,12 +2515,14 @@ focus_win(struct ws_win *win) if ((cfw = find_window(cur_focus)) != NULL) unfocus_win(cfw); else { +#if 0 /* use larger hammer since the window was killed somehow */ - /* TAILQ_FOREACH(cfw, &win->ws->winlist, entry) + TAILQ_FOREACH(cfw, &win->ws->winlist, entry) if (cfw->ws && cfw->ws->r && cfw->ws->r->s) xcb_change_window_attributes(conn, cfw->id, XCB_CW_BORDER_PIXEL, - &cfw->ws->r->s->c[SWM_S_COLOR_UNFOCUS].color);*/ + &cfw->ws->r->s->c[SWM_S_COLOR_UNFOCUS].color); +#endif } win->ws->focus = win; @@ -2500,8 +2533,8 @@ focus_win(struct ws_win *win) win->id, XCB_CURRENT_TIME); grabbuttons(win, 1); xcb_change_window_attributes(conn, win->id, - XCB_CW_BORDER_PIXEL, - &win->ws->r->s->c[SWM_S_COLOR_FOCUS].color); + XCB_CW_BORDER_PIXEL, + &win->ws->r->s->c[SWM_S_COLOR_FOCUS].color); if (win->ws->cur_layout->flags & SWM_L_MAPONFOCUS || win->ws->always_raise) map_window_raised(win->id); @@ -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 @@ -4183,8 +4218,8 @@ update_window(struct ws_win *win) uint32_t wc[5]; mask = XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y | - XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT | - XCB_CONFIG_WINDOW_BORDER_WIDTH; + XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT | + XCB_CONFIG_WINDOW_BORDER_WIDTH; wc[0] = X(win); wc[1] = Y(win); wc[2] = WIDTH(win); @@ -5440,7 +5475,7 @@ updatenumlockmask(void) kc = modmap[i * modmap_r->keycodes_per_modifier + j]; - if (kc == *((xcb_keycode_t *)xcb_key_symbols_get_keycode(syms, + if (kc == *((xcb_keycode_t *)xcb_key_symbols_get_keycode(syms, XK_Num_Lock))) numlockmask = (1 << i); } @@ -6740,7 +6775,6 @@ print_win_geom(xcb_window_t w) { xcb_get_geometry_reply_t *wa; - wa = xcb_get_geometry_reply(conn, xcb_get_geometry(conn, w), NULL); DNPRINTF(SWM_D_MISC, "print_win_geom: window: 0x%x, root: 0x%x, " @@ -7059,12 +7093,14 @@ unmapnotify(xcb_unmap_notify_event_t *e) } } -/*void +#if 0 +void visibilitynotify(xcb_visibility_notify_event_t *e) { DNPRINTF(SWM_D_EVENT, "visibilitynotify: window: 0x%x\n", e->window); -}*/ +} +#endif void clientmessage(xcb_client_message_event_t *e) @@ -7152,7 +7188,7 @@ enable_wm(void) DNPRINTF(SWM_D_INIT, "enable_wm: screen %d, root: 0x%x\n", i, sc->root); wac = xcb_change_window_attributes_checked(conn, sc->root, - XCB_CW_EVENT_MASK, &val); + XCB_CW_EVENT_MASK, &val); if ((error = xcb_request_check(conn, wac))) { DNPRINTF(SWM_D_INIT, "enable_wm: error_code: %u\n", error->error_code); @@ -7446,7 +7482,7 @@ setup_screens(void) cursor = xcb_generate_id(conn); xcb_create_glyph_cursor(conn, cursor, cursor_font, cursor_font, - XC_left_ptr, XC_left_ptr + 1, 0, 0, 0, 0xffff, 0xffff, 0xffff); + XC_left_ptr, XC_left_ptr + 1, 0, 0, 0, 0xffff, 0xffff, 0xffff); wa[0] = cursor; /* map physical screens */ @@ -7813,9 +7849,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);