JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
Fix some styling.
[spectrwm.git] / spectrwm.c
index 5667102..67bd5cc 100644 (file)
@@ -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 */
@@ -7663,6 +7699,8 @@ main(int argc, char *argv[])
        if (xcb_connection_has_error(conn))
                errx(1, "can not get XCB connection");
 
+       XSetEventQueueOwner(display, XCBOwnsEventQueue);
+
        xcb_prefetch_extension_data(conn, &xcb_randr_id);
        xfd = xcb_get_file_descriptor(conn);
 
@@ -7811,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);