JasonWoof Got questions, comments, patches, etc.? Contact Jason Woofenden
we need to free what is returned from xcb_key_symbols_get_keycode
[spectrwm.git] / spectrwm.c
index 4ec1967..3d7e10e 100644 (file)
@@ -647,7 +647,6 @@ struct ewmh_hint {
 };
 
 /* function prototypes */
-xcb_char2b_t *char2b(const char *);
 int     conf_load(char *, int);
 void    constrain_window(struct ws_win *, struct swm_region *, int);
 void    do_sync(void);
@@ -659,7 +658,7 @@ void         focus_magic(struct ws_win *);
 xcb_atom_t get_atom_from_string(const char *);
 xcb_screen_t   *get_screen(int);
 char   *get_win_name(xcb_window_t);
-uint16_t getstate(xcb_window_t);
+uint32_t getstate(xcb_window_t);
 void    grabbuttons(struct ws_win *, int);
 void    map_window_raised(xcb_window_t);
 void    new_region(struct swm_screen *, int, int, int, int);
@@ -672,26 +671,6 @@ void        update_window(struct ws_win *);
 char   *get_atom_name(xcb_atom_t);
 #endif
 
-/* function definitions */
-xcb_char2b_t *
-char2b(const char *str)
-{
-       xcb_char2b_t    *s;
-       size_t          i, len;
-
-       len = strlen(str);
-       s = malloc(len * sizeof(xcb_char2b_t));
-       if (!s)
-               return (NULL);
-
-       for (i = 0; i < len; i++) {
-               s[i].byte1 = '\0';
-               s[i].byte2 = str[i];
-       }
-
-       return (s);
-}
-
 int
 parse_rgb(const char *rgb, uint16_t *rr, uint16_t *gg, uint16_t *bb)
 {
@@ -841,7 +820,9 @@ teardown_ewmh(void)
                pc = xcb_get_property(conn, 0, screens[i].root, sup_check,
                    XCB_ATOM_WINDOW, 0, 1);
                pr = xcb_get_property_reply(conn, pc, NULL);
-               if (pr) {
+               if (!pr)
+                       continue;
+               if (pr->format == sup_check) {
                        id = *((xcb_window_t *)xcb_get_property_value(pr));
 
                        xcb_destroy_window(conn, id);
@@ -1068,7 +1049,7 @@ void
 dumpwins(struct swm_region *r, union arg *args)
 {
        struct ws_win                           *win;
-       uint16_t                                state;
+       uint32_t                                state;
        xcb_get_window_attributes_cookie_t      c;
        xcb_get_window_attributes_reply_t       *wa;
 
@@ -1394,7 +1375,8 @@ bar_print(struct swm_region *r, const char *s)
            DefaultVisual(display, r->s->idx),
            DefaultColormap(display, r->s->idx));
 
-       XftDrawStringUtf8(draw, &bar_font_color, bar_font, x, bar_font->height,
+       XftDrawStringUtf8(draw, &bar_font_color, bar_font, x,
+           (HEIGHT(r->bar) + bar_font->height) / 2 - bar_font->descent,
            (FcChar8 *)s, len);
 
        XftDrawDestroy(draw);
@@ -1866,7 +1848,8 @@ bar_refresh(void)
 void
 bar_setup(struct swm_region *r)
 {
-       char                    *font;
+       char                    *font, *fontpos;
+       int                     count;
        xcb_screen_t            *screen = get_screen(r->s->idx);
        uint32_t                wa[3];
        XRenderColor            color;
@@ -1883,7 +1866,20 @@ bar_setup(struct swm_region *r)
                                continue;
 
                        DNPRINTF(SWM_D_INIT, "bar_setup: try font %s\n", font);
-                       bar_font = XftFontOpenName(display, r->s->idx, font);
+
+                       count = 0;
+                       fontpos = font;
+                       while ((fontpos = index(fontpos, '-'))) {
+                               count++;
+                               fontpos++;
+                       }
+
+                       if (count == 14)
+                               bar_font = XftFontOpenXlfd(display, r->s->idx,
+                                               font);
+                       else
+                               bar_font = XftFontOpenName(display, r->s->idx,
+                                               font);
                        if (!bar_font) {
                                warnx("unable to load font %s", font);
                                continue;
@@ -1898,7 +1894,7 @@ bar_setup(struct swm_region *r)
        if (bar_font == NULL)
                errx(1, "unable to open a font");
 
-       bar_height = bar_font->height + 4 * bar_border_width;
+       bar_height = bar_font->height + 2 * bar_border_width;
 
        if (bar_height < 1)
                bar_height = 1;
@@ -1969,10 +1965,10 @@ set_win_state(struct ws_win *win, uint16_t state)
            a_state, 32, 2, data);
 }
 
-uint16_t
+uint32_t
 getstate(xcb_window_t w)
 {
-       uint16_t                        result = 0;
+       uint32_t                        result = 0;
        xcb_get_property_cookie_t       c;
        xcb_get_property_reply_t        *r;
 
@@ -1980,7 +1976,8 @@ getstate(xcb_window_t w)
        r = xcb_get_property_reply(conn, c, NULL);
 
        if (r) {
-               result = *((uint16_t *)xcb_get_property_value(r));
+               if (r->type == a_state && r->format == 32 && r->length == 2)
+                       result = *((uint32_t *)xcb_get_property_value(r));
                free(r);
        }
 
@@ -2204,6 +2201,8 @@ fake_keypress(struct ws_win *win, xcb_keysym_t keysym, uint16_t modifiers)
        event.response_type = XCB_KEY_RELEASE;
        xcb_send_event(conn, 1, win->id,
            XCB_EVENT_MASK_KEY_RELEASE, (const char *)&event);
+
+       free(keycode);
 }
 
 void
@@ -2304,8 +2303,10 @@ find_window(xcb_window_t id)
                return (NULL);
 
        /* if we were looking for the parent return that window instead */
-       if (r->parent == 0 || r->root == r->parent)
+       if (r->parent == 0 || r->root == r->parent) {
+               free(r);
                return (NULL);
+       }
 
        /* look for parent */
        for (i = 0; i < num_screens; i++)
@@ -3735,12 +3736,10 @@ get_win_name(xcb_window_t win)
        if (xcb_icccm_get_wm_name_reply(conn, c, &r, NULL)) {
                if (r.name_len > 0) {
                        name = malloc(r.name_len + 1);
-                       if (!name) {
-                               xcb_icccm_get_text_property_reply_wipe(&r);
-                               return (NULL);
+                       if (name) {
+                               memcpy(name, r.name, r.name_len);
+                               name[r.name_len] = '\0';
                        }
-                       memcpy(name, r.name, r.name_len);
-                       name[r.name_len] = '\0';
                }
                xcb_icccm_get_text_property_reply_wipe(&r);
        }
@@ -3875,6 +3874,7 @@ search_win(struct swm_region *r, union arg *args)
        char                    s[8];
        FILE                    *lfile;
        size_t                  len;
+       XftDraw                 *draw;
        XGlyphInfo              info;
 
        DNPRINTF(SWM_D_MISC, "search_win\n");
@@ -3928,7 +3928,15 @@ search_win(struct swm_region *r, union arg *args)
                    XCB_GC_BACKGROUND | XCB_GC_GRAPHICS_EXPOSURES, gcv);
                map_window_raised(w);
 
-               xcb_image_text_8(conn, len, w, sw->gc, 2, bar_font->height, s);
+               draw = XftDrawCreate(display, w,
+                   DefaultVisual(display, r->s->idx),
+                   DefaultColormap(display, r->s->idx));
+
+               XftDrawStringUtf8(draw, &bar_font_color, bar_font, 2,
+                   (HEIGHT(r->bar) + bar_font->height) / 2 - bar_font->descent,
+                   (FcChar8 *)s, len);
+
+               XftDrawDestroy(draw);
 
                DNPRINTF(SWM_D_MISC, "search_win: mapped window: 0x%x\n", w);
 
@@ -5504,7 +5512,7 @@ updatenumlockmask(void)
 {
        unsigned int                            i, j;
        xcb_get_modifier_mapping_reply_t        *modmap_r;
-       xcb_keycode_t                           *modmap, kc;
+       xcb_keycode_t                           *modmap, kc, *keycode;
 
        DNPRINTF(SWM_D_MISC, "updatenumlockmask\n");
        numlockmask = 0;
@@ -5518,10 +5526,11 @@ updatenumlockmask(void)
                        for (j = 0; j < modmap_r->keycodes_per_modifier; j++) {
                                kc = modmap[i * modmap_r->keycodes_per_modifier
                                    + j];
-
-                               if (kc == *((xcb_keycode_t *)xcb_key_symbols_get_keycode(syms,
-                                   XK_Num_Lock)))
+                               keycode = xcb_key_symbols_get_keycode(syms,
+                                               XK_Num_Lock);
+                               if (kc == *keycode)  
                                        numlockmask = (1 << i);
+                               free(keycode);
                        }
                }
                free(modmap_r);
@@ -5556,6 +5565,7 @@ grabkeys(void)
                                            kp->mod | modifiers[j],
                                            *code, XCB_GRAB_MODE_ASYNC,
                                            XCB_GRAB_MODE_ASYNC);
+                               free(code);
                }
        }
 }
@@ -6381,7 +6391,8 @@ window_get_pid(xcb_window_t win)
                goto tryharder;
        }
 
-       ret = *((pid_t *)xcb_get_property_value(pr));
+       if (pr->type == apid && pr->format == 32)
+               ret = *((pid_t *)xcb_get_property_value(pr));
        free(pr);
 
        return (ret);
@@ -6393,7 +6404,7 @@ tryharder:
        pr = xcb_get_property_reply(conn, pc, NULL);
        if (!pr)
                return (0);
-       if (pr->type != XCB_ATOM_STRING) {
+       if (pr->type != apid) {
                free(pr);
                return (0);
        }
@@ -6417,7 +6428,9 @@ get_ws_idx(xcb_window_t id)
                xcb_get_property(conn, 0, id, a_swm_ws,
                    XCB_ATOM_STRING, 0, SWM_PROPLEN),
                NULL);
-       if (gpr) {
+       if (!gpr)
+               return (-1);
+       if (gpr->type) {
                proplen = xcb_get_property_value_length(gpr);
                if (proplen > 0) {
                        prop = malloc(proplen + 1);
@@ -6438,6 +6451,7 @@ get_ws_idx(xcb_window_t id)
                        DNPRINTF(SWM_D_PROP, "get_ws_idx: window: #%s: %s",
                            errstr, prop);
                }
+               free(prop);
        }
 
        return ws_idx;
@@ -7089,7 +7103,7 @@ maprequest(xcb_map_request_event_t *e)
 char *
 get_atom_name(xcb_atom_t atom)
 {
-       char                            *name;
+       char                            *name = NULL;
        size_t                          len;
        xcb_get_atom_name_reply_t       *r;
 
@@ -7103,14 +7117,12 @@ get_atom_name(xcb_atom_t atom)
                        if (name) {
                                memcpy(name, xcb_get_atom_name_name(r), len);
                                name[len] = '\0';
-
-                               return name;
                        }
                }
                free(r);
        }
 
-       return NULL;
+       return (name);
 }
 #endif