X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=spectrwm.c;h=ab82ff1bb75ebb8bc20827827d3fdba9062cadb7;hb=f6733e1aa641ae84bb9b76267a7adde30a7f71bc;hp=4b5adf90da1bd4f689b050a062ae48cd7fe0faff;hpb=e676f5a92b2ec69ef047f13abb6bb2daae1830f3;p=spectrwm.git diff --git a/spectrwm.c b/spectrwm.c index 4b5adf9..ab82ff1 100644 --- a/spectrwm.c +++ b/spectrwm.c @@ -89,20 +89,17 @@ #include #include #include -#include -#include -#include -#include -#include +#include #include #include -#include +#include #include #include #include #include #include #include +#include /* local includes */ #include "version.h" @@ -246,10 +243,10 @@ u_int32_t swm_debug = 0 #endif char **start_argv; -xcb_atom_t astate; -xcb_atom_t aprot; -xcb_atom_t adelete; -xcb_atom_t takefocus; +xcb_atom_t a_state; +xcb_atom_t a_prot; +xcb_atom_t a_delete; +xcb_atom_t a_takefocus; xcb_atom_t a_wmname; xcb_atom_t a_netwmname; xcb_atom_t a_utf8_string; @@ -259,13 +256,11 @@ volatile sig_atomic_t running = 1; volatile sig_atomic_t restart_wm = 0; int outputs = 0; /*int last_focus_event = FocusOut;*/ -int (*xerrorxlib)(Display *, XErrorEvent *); int other_wm; int ss_enabled = 0; int xrandr_support; int xrandr_eventbase; unsigned int numlockmask = 0; -Display *display; xcb_connection_t *conn; xcb_key_symbols_t *syms; @@ -354,17 +349,13 @@ int border_width = 1; int verbose_layout = 0; time_t time_started; pid_t bar_pid; +#if 0 XFontSet bar_fs; XFontSetExtents *bar_fs_extents; +#endif char *bar_fonts; struct passwd *pwd; -#define SWM_MENU_FN (2) -#define SWM_MENU_NB (4) -#define SWM_MENU_NF (6) -#define SWM_MENU_SB (8) -#define SWM_MENU_SF (10) - /* layout manager data */ struct swm_geometry { int x; @@ -843,7 +834,6 @@ ewmh_autoquirk(struct ws_win *win) { uint32_t i, n; xcb_atom_t *type; - xcb_get_property_cookie_t c; xcb_get_property_reply_t *r; @@ -1282,12 +1272,12 @@ plain_stacker(struct workspace *ws) void custom_region(char *val) { - unsigned int sidx, x, y, w, h; - int num_screens; + unsigned int x, y, w, h; + int sidx, num_screens; xcb_screen_t *screen; num_screens = xcb_setup_roots_length(xcb_get_setup(conn)); - if (sscanf(val, "screen[%u]:%ux%u+%u+%u", &sidx, &w, &h, &x, &y) != 5) + if (sscanf(val, "screen[%d]:%ux%u+%u+%u", &sidx, &w, &h, &x, &y) != 5) errx(1, "invalid custom region, " "should be 'screen[]:x++"); if (sidx < 1 || sidx > num_screens) @@ -1334,6 +1324,8 @@ bar_print(struct swm_region *r, const char *s) XRectangle ibox, lbox; len = strlen(s); + /* FIXME fix bar font position calculations */ +#if 0 XmbTextExtents(bar_fs, s, len, &ibox, &lbox); switch (bar_justify) { @@ -1350,6 +1342,7 @@ bar_print(struct swm_region *r, const char *s) if (x < SWM_BAR_OFFSET) x = SWM_BAR_OFFSET; +#endif rect.x = 0; rect.y = 0; @@ -1367,9 +1360,14 @@ bar_print(struct swm_region *r, const char *s) xcb_change_gc(conn, r->s->bar_gc, XCB_GC_BACKGROUND, gcv); gcv[0] = r->s->c[SWM_S_COLOR_BAR_FONT].color; xcb_change_gc(conn, r->s->bar_gc, XCB_GC_FOREGROUND, gcv); +#if 0 xcb_image_text_8(conn, len, r->bar->buffer, r->s->bar_gc, x, (bar_fs_extents->max_logical_extent.height - lbox.height) / 2 - lbox.y, s); +#else + /* workaround */ + xcb_image_text_8(conn, len, r->bar->buffer, r->s->bar_gc, 4, 14, s); +#endif /* blt */ xcb_copy_area(conn, r->bar->buffer, r->bar->id, r->s->bar_gc, 0, 0, @@ -1838,18 +1836,20 @@ bar_setup(struct swm_region *r) xcb_screen_t *screen = get_screen(r->s->idx); uint32_t wa[3]; +#if 0 if (bar_fs) { XFreeFontSet(display, bar_fs); bar_fs = NULL; } +#endif if ((r->bar = calloc(1, sizeof(struct swm_bar))) == NULL) err(1, "bar_setup: calloc: failed to allocate memory."); - +#if 0 DNPRINTF(SWM_D_BAR, "bar_setup: loading bar_fonts: %s\n", bar_fonts); bar_fs = XCreateFontSet(display, bar_fonts, &missing_charsets, - &num_missing_charsets, &default_string); + &num_missing_charsets, &default_string);*/ if (num_missing_charsets > 0) { warnx("Unable to load charset(s):"); @@ -1876,7 +1876,10 @@ bar_setup(struct swm_region *r) if (bar_height < 1) bar_height = 1; - +#else + /* workaround */ + bar_height = 24; +#endif 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; @@ -1886,6 +1889,8 @@ bar_setup(struct swm_region *r) wa[0] = r->s->c[SWM_S_COLOR_BAR].color; wa[1] = r->s->c[SWM_S_COLOR_BAR_BORDER].color; wa[2] = XCB_EVENT_MASK_EXPOSURE; + DNPRINTF(SWM_D_BAR, "bar_setup: create_window: (x,y) w x h: (%d,%d) " + "%d x %d\n", X(r->bar), Y(r->bar), WIDTH(r->bar), HEIGHT(r->bar)); xcb_create_window(conn, XCB_COPY_FROM_PARENT, r->bar->id, r->s->root, X(r->bar), Y(r->bar), WIDTH(r->bar), HEIGHT(r->bar), bar_border_width, XCB_WINDOW_CLASS_INPUT_OUTPUT, @@ -1932,8 +1937,8 @@ set_win_state(struct ws_win *win, uint16_t state) if (win == NULL) return; - xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->id, astate, - astate, 32, 2, data); + xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->id, a_state, + a_state, 32, 2, data); } uint16_t @@ -1943,7 +1948,7 @@ getstate(xcb_window_t w) xcb_get_property_cookie_t c; xcb_get_property_reply_t *r; - c = xcb_get_property(conn, False, w, astate, astate, 0L, 2L); + c = xcb_get_property(conn, False, w, a_state, a_state, 0L, 2L); r = xcb_get_property_reply(conn, c, NULL); if (r) { @@ -1981,7 +1986,7 @@ client_msg(struct ws_win *win, xcb_atom_t a) bzero(&ev, sizeof ev); ev.response_type = XCB_CLIENT_MESSAGE; ev.window = win->id; - ev.type = aprot; + ev.type = a_prot; ev.format = 32; ev.data.data32[0] = a; ev.data.data32[1] = XCB_CURRENT_TIME; @@ -2156,11 +2161,11 @@ fake_keypress(struct ws_win *win, xcb_keysym_t keysym, uint16_t modifiers) event.response_type = XCB_KEY_PRESS; xcb_send_event(conn, True, win->id, - XCB_EVENT_MASK_KEY_PRESS, (char *)&event); + XCB_EVENT_MASK_KEY_PRESS, (const char *)&event); event.response_type = XCB_KEY_RELEASE; xcb_send_event(conn, True, win->id, - XCB_EVENT_MASK_KEY_RELEASE, (char *)&event); + XCB_EVENT_MASK_KEY_RELEASE, (const char *)&event); } void @@ -2189,8 +2194,8 @@ restart(struct swm_region *r, union arg *args) struct swm_region * root_to_region(xcb_window_t root) { - struct swm_region *r = NULL; - int i, num_screens; + struct swm_region *r = NULL; + int i, num_screens; xcb_query_pointer_reply_t *qpr; DNPRINTF(SWM_D_MISC, "root_to_region: window: 0x%x\n", root); @@ -2241,7 +2246,6 @@ find_window(xcb_window_t id) { struct ws_win *win; int i, j, num_screens; - xcb_query_tree_cookie_t c; xcb_query_tree_reply_t *r; num_screens = xcb_setup_roots_length(xcb_get_setup(conn)); @@ -2251,8 +2255,7 @@ find_window(xcb_window_t id) if (id == win->id) return (win); - c = xcb_query_tree(conn, id); - r = xcb_query_tree_reply(conn, c, NULL); + r = xcb_query_tree_reply(conn, xcb_query_tree(conn, id), NULL); if (!r) return (NULL); @@ -2281,8 +2284,7 @@ spawn(int ws_idx, union arg *args, int close_fd) DNPRINTF(SWM_D_MISC, "spawn: %s\n", args->argv[0]); - if (display) - close(xcb_get_file_descriptor(conn)); + close(xcb_get_file_descriptor(conn)); setenv("LD_PRELOAD", SWM_LIB, 1); @@ -2456,7 +2458,6 @@ void focus_win(struct ws_win *win) { struct ws_win *cfw = NULL; - xcb_get_input_focus_cookie_t c; xcb_get_input_focus_reply_t *r; xcb_window_t cur_focus = XCB_WINDOW_NONE; @@ -2480,8 +2481,7 @@ focus_win(struct ws_win *win) return; } - c = xcb_get_input_focus(conn); - r = xcb_get_input_focus_reply(conn, c, NULL); + r = xcb_get_input_focus_reply(conn, xcb_get_input_focus(conn), NULL); if (r) { cur_focus = r->focus; free(r); @@ -2520,6 +2520,20 @@ focus_win(struct ws_win *win) } void +event_drain(uint8_t rt) +{ + xcb_generic_event_t *evt; + + xcb_flush(conn); + while ((evt = xcb_poll_for_event(conn))) { + if (XCB_EVENT_RESPONSE_TYPE(evt) != rt) + event_handle(evt); + + free(evt); + } +} + +void switchws(struct swm_region *r, union arg *args) { int wsid = args->id, unmap_old = 0; @@ -2573,7 +2587,10 @@ switchws(struct swm_region *r, union arg *args) TAILQ_FOREACH(win, &old_ws->winlist, entry) unmap_window(win); - xcb_flush(conn); + if (focus_mode == SWM_FOCUS_DEFAULT) + event_drain(XCB_ENTER_NOTIFY); + else + xcb_flush(conn); } void @@ -2985,9 +3002,12 @@ cycle_layout(struct swm_region *r, union arg *args) ws->cur_layout = &layouts[0]; stack(); + bar_update(); - a.id = SWM_ARG_ID_FOCUSCUR; + if (focus_mode == SWM_FOCUS_DEFAULT) + event_drain(XCB_ENTER_NOTIFY); + a.id = SWM_ARG_ID_FOCUSCUR; focus(r, &a); } @@ -3045,6 +3065,9 @@ stack(void) { if (font_adjusted) font_adjusted--; + if (focus_mode == SWM_FOCUS_DEFAULT) + event_drain(XCB_ENTER_NOTIFY); + DNPRINTF(SWM_D_STACK, "stack: end\n"); } @@ -3797,6 +3820,7 @@ search_win(struct swm_region *r, union arg *args) FILE *lfile; size_t len; XRectangle ibox, lbox; + DNPRINTF(SWM_D_MISC, "search_win\n"); search_r = r; @@ -3827,15 +3851,26 @@ search_win(struct swm_region *r, union arg *args) snprintf(s, sizeof s, "%d", i); len = strlen(s); + /* FIXME fix calculations */ +#if 0 XmbTextExtents(bar_fs, s, len, &ibox, &lbox); +#endif w = xcb_generate_id(conn); wa[0] = r->s->c[SWM_S_COLOR_FOCUS].color; wa[1] = r->s->c[SWM_S_COLOR_UNFOCUS].color; +#if 0 xcb_create_window(conn, XCB_COPY_FROM_PARENT, w, win->id, 0, 0, lbox.width + 4, bar_fs_extents->max_logical_extent.height, 1, XCB_WINDOW_CLASS_INPUT_OUTPUT, XCB_COPY_FROM_PARENT, XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL, wa); +#else + /* workaround */ + xcb_create_window(conn, XCB_COPY_FROM_PARENT, w, win->id, 0, 0, + 22, 20, 1, XCB_WINDOW_CLASS_INPUT_OUTPUT, + XCB_COPY_FROM_PARENT, XCB_CW_BACK_PIXEL | + XCB_CW_BORDER_PIXEL, wa); +#endif sw->indicator = w; TAILQ_INSERT_TAIL(&search_wl, sw, entry); @@ -3848,9 +3883,14 @@ search_win(struct swm_region *r, union arg *args) XCB_GC_BACKGROUND | XCB_GC_GRAPHICS_EXPOSURES, gcv); map_window_raised(w); +#if 0 xcb_image_text_8(conn, len, w, sw->gc, 2, (bar_fs_extents->max_logical_extent.height - lbox.height) / 2 - lbox.y, s); +#else + /* workaround */ + xcb_image_text_8(conn, len, w, sw->gc, 6, 14, s); +#endif DNPRINTF(SWM_D_MISC, "search_win: mapped window: 0x%x\n", w); @@ -4052,7 +4092,7 @@ wkill(struct swm_region *r, union arg *args) xcb_kill_client(conn, r->ws->focus->id); else if (r->ws->focus->can_delete) - client_msg(r->ws->focus, adelete); + client_msg(r->ws->focus, a_delete); xcb_flush(conn); } @@ -4117,6 +4157,7 @@ floating_toggle(struct swm_region *r, union arg *args) } xcb_flush(conn); + event_drain(XCB_ENTER_NOTIFY); } void @@ -4293,10 +4334,6 @@ resize(struct ws_win *win, union arg *args) xcb_flush(conn); resizing = 1; while ((evt = xcb_wait_for_event(conn)) && resizing) { - /* - XMaskEvent(display, MOUSEMASK | ExposureMask | - SubstructureRedirectMask, &ev); - */ switch (XCB_EVENT_RESPONSE_TYPE(evt)) { case XCB_BUTTON_RELEASE: DNPRINTF(SWM_D_EVENT, "resize: BUTTON_RELEASE\n"); @@ -5097,7 +5134,7 @@ parsekeys(char *keystr, unsigned int currmod, unsigned int *mod, KeySym *ks) return (1); } cp = keystr; - *ks = NoSymbol; + *ks = XCB_NO_SYMBOL; *mod = 0; while ((name = strsep(&cp, SWM_KEY_WS)) != NULL) { DNPRINTF(SWM_D_KEY, "parsekeys: key [%s]\n", name); @@ -5120,7 +5157,7 @@ parsekeys(char *keystr, unsigned int currmod, unsigned int *mod, KeySym *ks) else { *ks = XStringToKeysym(name); XConvertCase(*ks, ks, &uks); - if (ks == NoSymbol) { + if (ks == XCB_NO_SYMBOL) { DNPRINTF(SWM_D_KEY, "parsekeys: invalid key %s\n", name); @@ -5438,8 +5475,8 @@ updatenumlockmask(void) void grabkeys(void) { - int num_screens; - unsigned int j, k; + int num_screens, k; + unsigned int j; xcb_keycode_t *code; unsigned int modifiers[] = { 0, LockMask, numlockmask, numlockmask | LockMask }; @@ -6295,7 +6332,7 @@ manage_window(xcb_window_t id) xcb_window_t trans = XCB_WINDOW_NONE; struct workspace *ws; struct ws_win *win, *ww; - int i, ws_idx, border_me = 0; + int ws_idx, border_me = 0; xcb_atom_t ws_idx_atom = XCB_ATOM_NONE; char ws_idx_str[SWM_PROPLEN], *prop = NULL; size_t proplen; @@ -6303,7 +6340,7 @@ manage_window(xcb_window_t id) const char *errstr; struct pid_e *p; struct quirk *qp; - uint32_t event_mask; + uint32_t event_mask, i; xcb_atom_t prot; xcb_get_property_reply_t *gpr; xcb_icccm_get_wm_protocols_reply_t wpr; @@ -6399,9 +6436,9 @@ manage_window(xcb_window_t id) xcb_icccm_get_wm_protocols(conn, id, prot), &wpr, NULL)) { for (i = 0; i < wpr.atoms_len; i++) { - if (wpr.atoms[i] == takefocus) + if (wpr.atoms[i] == a_takefocus) win->take_focus = 1; - if (wpr.atoms[i] == adelete) + if (wpr.atoms[i] == a_delete) win->can_delete = 1; } xcb_icccm_get_wm_protocols_reply_wipe(&wpr); @@ -6635,25 +6672,26 @@ focus_magic(struct ws_win *win) if (win->java) { focus_win(win->child_trans); if (win->child_trans->take_focus) - client_msg(win, takefocus); + client_msg(win, a_takefocus); } else { /* make sure transient hasn't disappeared */ if (validate_win(win->child_trans) == 0) { focus_win(win->child_trans); if (win->child_trans->take_focus) - client_msg(win->child_trans, takefocus); + client_msg(win->child_trans, + a_takefocus); } else { win->child_trans = NULL; focus_win(win); if (win->take_focus) - client_msg(win, takefocus); + client_msg(win, a_takefocus); } } } else { /* regular focus */ focus_win(win); if (win->take_focus) - client_msg(win, takefocus); + client_msg(win, a_takefocus); } } @@ -6677,12 +6715,12 @@ expose(xcb_expose_event_t *e) void keypress(xcb_key_press_event_t *e) { - KeySym keysym; + xcb_keysym_t keysym; struct key *kp; - keysym = XkbKeycodeToKeysym(display, (KeyCode)e->detail, 0, 0); + keysym = xcb_key_press_lookup_keysym(syms, e, 0); - DNPRINTF(SWM_D_EVENT, "keypress: %u\n", e->detail); + DNPRINTF(SWM_D_EVENT, "keypress: %u %u\n", e->detail, keysym); if ((kp = key_lookup(CLEANMASK(e->state), keysym)) == NULL) return; @@ -6699,7 +6737,8 @@ void buttonpress(xcb_button_press_event_t *e) { struct ws_win *win; - int i, action; + int i; + unsigned int action; DNPRINTF(SWM_D_EVENT, "buttonpress: window 0x%x, detail: %u\n", e->event, e->detail); @@ -6834,11 +6873,6 @@ void enternotify(xcb_enter_notify_event_t *e) { struct ws_win *win; -#if 0 - struct ws_win *w; - Window focus_return; - int revert_to_return; -#endif DNPRINTF(SWM_D_FOCUS, "enternotify: window: 0x%x, mode: %d, detail: " "%d, root: 0x%x, subwindow: 0x%x, same_screen_focus: %s, " "state: %d\n", e->event, e->mode, e->detail, e->root, @@ -6856,74 +6890,6 @@ enternotify(xcb_enter_notify_event_t *e) case SWM_FOCUS_FOLLOW: break; case SWM_FOCUS_SYNERGY: -#if 0 - /* - * all these checks need to be in this order because the - * XCheckTypedWindowEvent relies on weeding out the previous events - * - * making this code an option would enable a follow mouse for focus - * feature - */ - - /* - * state is set when we are switching workspaces and focus is set when - * the window or a subwindow already has focus (occurs during restart). - * - * Only honor the focus flag if last_focus_event is not FocusOut, - * this allows spectrwm to continue to control focus when another - * program is also playing with it. - */ - if (ev->state || (ev->focus && last_focus_event != FocusOut)) { - DNPRINTF(SWM_D_EVENT, "ignoring enternotify: focus\n"); - return; - } - - /* - * happens when a window is created or destroyed and the border - * crosses the mouse pointer and when switching ws - * - * we need the subwindow test to see if we came from root in order - * to give focus to floaters - */ - if (ev->mode == NotifyNormal && ev->detail == NotifyVirtual && - ev->subwindow == 0) { - DNPRINTF(SWM_D_EVENT, "ignoring enternotify: NotifyVirtual\n"); - return; - } - - /* this window already has focus */ - if (ev->mode == NotifyNormal && ev->detail == NotifyInferior) { - DNPRINTF(SWM_D_EVENT, "ignoring enternotify: win has focus\n"); - return; - } - - /* this window is being deleted or moved to another ws */ - if (XCheckTypedWindowEvent(display, ev->window, ConfigureNotify, - &cne) == True) { - DNPRINTF(SWM_D_EVENT, "ignoring enternotify: configurenotify\n"); - XPutBackEvent(display, &cne); - return; - } - - if ((win = find_window(ev->window)) == NULL) { - DNPRINTF(SWM_D_EVENT, "ignoring enternotify: win == NULL\n"); - return; - } - - /* - * In fullstack kill all enters unless they come from a different ws - * (i.e. another region) or focus has been grabbed externally. - */ - if (win->ws->cur_layout->flags & SWM_L_FOCUSPREV && - last_focus_event != FocusOut) { - XGetInputFocus(display, &focus_return, &revert_to_return); - if ((w = find_window(focus_return)) == NULL || - w->ws == win->ws) { - DNPRINTF(SWM_D_EVENT, "ignoring event: fullstack\n"); - return; - } - } -#endif break; } @@ -7045,20 +7011,6 @@ propertynotify(xcb_property_notify_event_t *e) } switch (e->atom) { -#if 0 - case XCB_ATOM_WM_NORMAL_HINTS: - xcb_icccm_get_wm_normal_hints(conn, - xcb_iccom_get_wm_normal_hints(conn, win->id), - &win->sh, NULL); - warnx("normal hints: flag 0x%x", win->sh.flags); - if (win->sh.flags & XCB_SIZE_HINT_P_MIN_SIZE) { - WIDTH(win) = win->sh.min_width; - HEIGHT(win) = win->sh.min_height; - warnx("min %d %d", WIDTH(win), HEIGHT(win)); - } - XMoveResizeWindow(display, win->id, - X(win), Y(win), WIDTH(win), HEIGHT(win)); -#endif case XCB_ATOM_WM_CLASS: case XCB_ATOM_WM_NAME: bar_update(); @@ -7117,7 +7069,7 @@ clientmessage(xcb_client_message_event_t *e) if (e->type == ewmh[_NET_CLOSE_WINDOW].atom) { DNPRINTF(SWM_D_EVENT, "clientmessage: _NET_CLOSE_WINDOW\n"); if (win->can_delete) - client_msg(win, adelete); + client_msg(win, a_delete); else xcb_kill_client(conn, win->id); } @@ -7155,36 +7107,20 @@ clientmessage(xcb_client_message_event_t *e) xcb_flush(conn); } -int -xerror_start(Display *d, XErrorEvent *ee) -{ - other_wm = 1; - return (-1); -} - -int -xerror(Display *d, XErrorEvent *ee) -{ - /* warnx("error: %p %p", display, ee); */ - return (-1); -} - -int +void active_wm(void) { - other_wm = 0; - xerrorxlib = XSetErrorHandler(xerror_start); + int num_screens, i; + const uint32_t val = XCB_EVENT_MASK_SUBSTRUCTURE_REDIRECT; + xcb_screen_t *sc; /* this causes an error if some other window manager is running */ - XSelectInput(display, DefaultRootWindow(display), - SubstructureRedirectMask); - do_sync(); - if (other_wm) - return (1); - - XSetErrorHandler(xerror); - do_sync(); - return (0); + num_screens = xcb_setup_roots_length(xcb_get_setup(conn)); + for (i = 0; i < num_screens; i++) { + sc = get_screen(i); + xcb_change_window_attributes(conn, sc->root, + XCB_CW_EVENT_MASK, &val); + } } void @@ -7483,7 +7419,7 @@ setup_screens(void) screens[i].idx = i; TAILQ_INIT(&screens[i].rl); TAILQ_INIT(&screens[i].orl); - screens[i].root = RootWindow(display, i); + screens[i].root = get_screen(i)->root; /* set default colors */ setscreencolor("red", i + 1, SWM_S_COLOR_FOCUS); @@ -7540,6 +7476,19 @@ setup_globals(void) if ((clock_format = strdup("%a %b %d %R %Z %Y")) == NULL) err(1, "setup_globals: strdup: failed to allocate memory."); + + if ((syms = xcb_key_symbols_alloc(conn)) == NULL) + errx(1, "unable to allocate key symbols"); + + a_state = get_atom_from_string("WM_STATE"); + a_prot = get_atom_from_string("WM_PROTOCOLS"); + a_delete = get_atom_from_string("WM_DELETE_WINDOW"); + a_takefocus = get_atom_from_string("WM_TAKE_FOCUS"); + a_wmname = get_atom_from_string("WM_NAME"); + a_netwmname = get_atom_from_string("_NET_WM_NAME"); + a_utf8_string = get_atom_from_string("UTF8_STRING"); + a_string = get_atom_from_string("STRING"); + a_swm_iconic = get_atom_from_string("_SWM_ICONIC"); } void @@ -7654,16 +7603,9 @@ main(int argc, char *argv[]) start_argv = argv; warnx("Welcome to spectrwm V%s Build: %s", SPECTRWM_VERSION, buildstr); - if (!setlocale(LC_CTYPE, "") || !setlocale(LC_TIME, "") || - !XSupportsLocale()) + if (!setlocale(LC_CTYPE, "") || !setlocale(LC_TIME, "")) warnx("no locale support"); - if (!X_HAVE_UTF8_STRING) - warnx("no UTF-8 support"); - - if (!(display = XOpenDisplay(0))) - errx(1, "can not open display"); - /* handle some signals */ bzero(&sact, sizeof(sact)); sigemptyset(&sact.sa_mask); @@ -7678,24 +7620,12 @@ main(int argc, char *argv[]) sact.sa_flags = SA_NOCLDSTOP; sigaction(SIGCHLD, &sact, NULL); - conn = XGetXCBConnection(display); + conn = xcb_connect(NULL, NULL); if (xcb_connection_has_error(conn)) errx(1, "can not get XCB connection"); + xcb_prefetch_extension_data(conn, &xcb_randr_id); xfd = xcb_get_file_descriptor(conn); - syms = xcb_key_symbols_alloc(conn); - if (!syms) - errx(1, "unable to allocate key symbols"); - - astate = get_atom_from_string("WM_STATE"); - aprot = get_atom_from_string("WM_PROTOCOLS"); - adelete = get_atom_from_string("WM_DELETE_WINDOW"); - takefocus = get_atom_from_string("WM_TAKE_FOCUS"); - a_wmname = get_atom_from_string("WM_NAME"); - a_netwmname = get_atom_from_string("_NET_WM_NAME"); - a_utf8_string = get_atom_from_string("UTF8_STRING"); - a_string = get_atom_from_string("STRING"); - a_swm_iconic = get_atom_from_string("_SWM_ICONIC"); /* look for local and global conf file */ pwd = getpwuid(getuid()); @@ -7712,11 +7642,12 @@ main(int argc, char *argv[]) free(evt); } - if (active_wm()) - errx(1, "other wm running"); - + active_wm(); xcb_aux_sync(conn); + if (xcb_poll_for_event(conn) != NULL) + errx(1, "another window manager is currently running"); + setup_globals(); setup_screens(); setup_keys(); @@ -7842,8 +7773,9 @@ 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_fs); - +#endif xcb_key_symbols_free(syms); xcb_disconnect(conn);