X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=spectrwm.c;h=6fd39be48f5172745c37d429af9711f3c0e68853;hb=cd59d61775ade249974eae9bd17d58b95967253d;hp=d1c876f422b00fe9fb28d12fd42e30303b473995;hpb=ced6f98d601b5fce8ee4cd92b292edc473f49203;p=spectrwm.git diff --git a/spectrwm.c b/spectrwm.c index d1c876f..6fd39be 100644 --- a/spectrwm.c +++ b/spectrwm.c @@ -8,6 +8,7 @@ * Copyright (c) 2011-2012 Reginald Kennedy * Copyright (c) 2011-2012 Lawrence Teo * Copyright (c) 2011-2012 Tiago Cunha + * Copyright (c) 2012 David Hill * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above @@ -647,7 +648,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); @@ -672,26 +672,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,15 +821,16 @@ 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 && pr->format == sup_check) { + if (!pr) + continue; + if (pr->format == sup_check) { id = *((xcb_window_t *)xcb_get_property_value(pr)); xcb_destroy_window(conn, id); xcb_delete_property(conn, screens[i].root, sup_check); xcb_delete_property(conn, screens[i].root, sup_list); - - free(pr); } + free(pr); } } @@ -2220,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 @@ -2320,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++) @@ -3751,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); } @@ -4302,7 +4285,6 @@ resize(struct ws_win *win, union arg *args) xcb_cursor_t cursor; xcb_font_t cursor_font; xcb_grab_pointer_cookie_t gpc; - xcb_grab_pointer_reply_t *gpr; xcb_query_pointer_reply_t *xpr; xcb_generic_event_t *evt; xcb_motion_notify_event_t *mne; @@ -4389,13 +4371,6 @@ resize(struct ws_win *win, union arg *args) gpc = xcb_grab_pointer(conn, 0, win->id, MOUSEMASK, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC, XCB_WINDOW_NONE, cursor, XCB_CURRENT_TIME), - gpr = xcb_grab_pointer_reply(conn, gpc, NULL); - if (!gpr) { - xcb_free_cursor(conn, cursor); - xcb_close_font(conn, cursor_font); - free(xpr); - return; - } xcb_flush(conn); resizing = 1; @@ -4475,7 +4450,6 @@ resize(struct ws_win *win, union arg *args) xcb_ungrab_pointer(conn, XCB_CURRENT_TIME); xcb_free_cursor(conn, cursor); xcb_close_font(conn, cursor_font); - free(gpr); free(xpr); DNPRINTF(SWM_D_EVENT, "resize: done\n"); } @@ -4504,7 +4478,6 @@ move(struct ws_win *win, union arg *args) xcb_font_t cursor_font; xcb_cursor_t cursor; xcb_grab_pointer_cookie_t gpc; - xcb_grab_pointer_reply_t *gpr; xcb_query_pointer_reply_t *qpr; xcb_generic_event_t *evt; xcb_motion_notify_event_t *mne; @@ -4572,12 +4545,6 @@ move(struct ws_win *win, union arg *args) gpc = xcb_grab_pointer(conn, 0, win->id, MOUSEMASK, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC, XCB_WINDOW_NONE, cursor, XCB_CURRENT_TIME); - gpr = xcb_grab_pointer_reply(conn, gpc, NULL); - if (!gpr) { - xcb_free_cursor(conn, cursor); - xcb_close_font(conn, cursor_font); - return; - } /* get cursor offset from window root */ qpr = xcb_query_pointer_reply(conn, xcb_query_pointer(conn, win->id), @@ -5529,7 +5496,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; @@ -5543,10 +5510,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); @@ -5581,6 +5549,7 @@ grabkeys(void) kp->mod | modifiers[j], *code, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC); + free(code); } } } @@ -6443,7 +6412,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 && gpr->type) { + if (!gpr) + return (-1); + if (gpr->type) { proplen = xcb_get_property_value_length(gpr); if (proplen > 0) { prop = malloc(proplen + 1); @@ -6454,8 +6425,8 @@ get_ws_idx(xcb_window_t id) prop[proplen] = '\0'; } } - free(gpr); } + free(gpr); if (prop) { DNPRINTF(SWM_D_PROP, "get_ws_idx: _SWM_WS: %s\n", prop); @@ -6483,6 +6454,7 @@ manage_window(xcb_window_t id) struct quirk *qp; uint32_t event_mask, i; xcb_icccm_get_wm_protocols_reply_t wpr; + xcb_icccm_get_wm_class_reply_t tmpch; if ((win = find_window(id)) != NULL) return (win); /* already being managed */ @@ -6648,7 +6620,12 @@ manage_window(xcb_window_t id) if (xcb_icccm_get_wm_class_reply(conn, xcb_icccm_get_wm_class(conn, win->id), - &win->ch, NULL)) { + &tmpch, NULL)) { + win->ch.class_name = tmpch.class_name; + win->ch.instance_name = tmpch.instance_name; + + xcb_icccm_get_wm_class_reply_wipe(&tmpch); + DNPRINTF(SWM_D_CLASS, "manage_window: class: %s, name: %s\n", win->ch.class_name, win->ch.instance_name); @@ -6727,9 +6704,7 @@ free_window(struct ws_win *win) if (win->wa) free(win->wa); - - xcb_icccm_get_wm_class_reply_wipe(&win->ch); - + kill_refs(win); /* paint memory */ @@ -7116,7 +7091,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; @@ -7130,14 +7105,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 @@ -7423,8 +7396,9 @@ scan_xrandr(int i) return; } else ncrtc = srr->num_crtcs; + + crtc = xcb_randr_get_screen_resources_current_crtcs(srr); for (c = 0; c < ncrtc; c++) { - crtc = xcb_randr_get_screen_resources_current_crtcs(srr); cic = xcb_randr_get_crtc_info(conn, crtc[c], XCB_CURRENT_TIME); cir = xcb_randr_get_crtc_info_reply(conn, cic, NULL);