X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;f=spectrwm.c;h=3dbfdaa033bb3caa158ad55546aebfa1eba5ee5e;hb=28f220a7dfbfd005c7e7515beaa48d5d9d4a7cf7;hp=5025482814cbf950e1c38f7fc9ec7c3970391074;hpb=4697517042d3a6d9d9c1cd38ef1599227eeeb8da;p=spectrwm.git diff --git a/spectrwm.c b/spectrwm.c index 5025482..3dbfdaa 100644 --- a/spectrwm.c +++ b/spectrwm.c @@ -1114,7 +1114,7 @@ void mappingnotify(xcb_mapping_notify_event_t *); void maprequest(xcb_map_request_event_t *); void propertynotify(xcb_property_notify_event_t *); void unmapnotify(xcb_unmap_notify_event_t *); -void visibilitynotify(xcb_visibility_notify_event_t *); +/*void visibilitynotify(xcb_visibility_notify_event_t *);*/ void clientmessage(xcb_client_message_event_t *); void screenchange(xcb_randr_screen_change_notify_event_t *); @@ -1836,7 +1836,7 @@ bar_setup(struct swm_region *r) int num_missing_charsets = 0; int i; xcb_screen_t *screen = get_screen(r->s->idx); - uint32_t wa[2]; + uint32_t wa[3]; if (bar_fs) { XFreeFontSet(display, bar_fs); @@ -1885,10 +1885,12 @@ bar_setup(struct swm_region *r) r->bar->id = xcb_generate_id(conn); 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; 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, - XCB_COPY_FROM_PARENT, XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL, wa); + XCB_COPY_FROM_PARENT, XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL + | XCB_CW_EVENT_MASK, wa); r->bar->buffer = xcb_generate_id(conn); xcb_create_pixmap(conn, screen->root_depth, r->bar->buffer, r->bar->id, @@ -4165,7 +4167,7 @@ resize(struct ws_win *win, union arg *args) struct swm_region *r = NULL; int resize_step = 0; struct swm_geometry g; - int top = 0, left = 0, buttonrelease; + int top = 0, left = 0, resizing; int dx, dy; unsigned int shape; /* cursor style */ xcb_cursor_t cursor; @@ -4183,7 +4185,7 @@ resize(struct ws_win *win, union arg *args) if (win->ewmh_flags & EWMH_F_FULLSCREEN) return; - DNPRINTF(SWM_D_MOUSE, "resize: window: 0x%x, floating: %s, " + DNPRINTF(SWM_D_EVENT, "resize: window: 0x%x, floating: %s, " "transient: 0x%x\n", win->id, YESNO(win->floating), win->transient); @@ -4266,15 +4268,17 @@ resize(struct ws_win *win, union arg *args) return; } - buttonrelease = 0; - while ((evt = xcb_poll_for_event(conn)) && buttonrelease != 1) { + 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: - buttonrelease = 1; + DNPRINTF(SWM_D_EVENT, "resize: BUTTON_RELEASE\n"); + resizing = 0; break; case XCB_MOTION_NOTIFY: mne = (xcb_motion_notify_event_t *)evt; @@ -4348,6 +4352,7 @@ resize(struct ws_win *win, union arg *args) xcb_close_font(conn, cursor_font); free(gpr); free(xpr); + DNPRINTF(SWM_D_EVENT, "resize: done\n"); } void @@ -4369,7 +4374,7 @@ void move(struct ws_win *win, union arg *args) { xcb_timestamp_t timestamp = 0; - int move_step = 0, buttonrelease; + int move_step = 0, moving; struct swm_region *r = NULL; xcb_font_t cursor_font; xcb_cursor_t cursor; @@ -4386,7 +4391,7 @@ move(struct ws_win *win, union arg *args) if (win->ewmh_flags & EWMH_F_FULLSCREEN) return; - DNPRINTF(SWM_D_MOUSE, "move: window: 0x%x, floating: %s, transient: " + DNPRINTF(SWM_D_EVENT, "move: window: 0x%x, floating: %s, transient: " "0x%x\n", win->id, YESNO(win->floating), win->transient); /* in max_stack mode should only move transients */ @@ -4459,15 +4464,13 @@ move(struct ws_win *win, union arg *args) return; } - buttonrelease = 0; - while ((evt = xcb_poll_for_event(conn)) && buttonrelease != 1) { - /* - XMaskEvent(display, MOUSEMASK | ExposureMask | - SubstructureRedirectMask, &ev); - */ + xcb_flush(conn); + moving = 1; + while ((evt = xcb_wait_for_event(conn)) && moving) { switch (XCB_EVENT_RESPONSE_TYPE(evt)) { case XCB_BUTTON_RELEASE: - buttonrelease = 1; + DNPRINTF(SWM_D_EVENT, "move: BUTTON_RELEASE\n"); + moving = 0; break; case XCB_MOTION_NOTIFY: mne = (xcb_motion_notify_event_t *)evt; @@ -4498,6 +4501,7 @@ move(struct ws_win *win, union arg *args) xcb_free_cursor(conn, cursor); xcb_close_font(conn, cursor_font); xcb_ungrab_pointer(conn, XCB_CURRENT_TIME); + DNPRINTF(SWM_D_EVENT, "move: done\n"); } void @@ -6635,7 +6639,18 @@ focus_magic(struct ws_win *win) void expose(xcb_expose_event_t *e) { + int i, num_screens; + struct swm_region *r; + DNPRINTF(SWM_D_EVENT, "expose: window: 0x%x\n", e->window); + + num_screens = xcb_setup_roots_length(xcb_get_setup(conn)); + for (i = 0; i < num_screens; i++) + TAILQ_FOREACH(r, &screens[i].rl, entry) + if (e->window == WINID(r->bar)) + bar_update(); + + xcb_flush(conn); } void @@ -6667,7 +6682,8 @@ buttonpress(xcb_button_press_event_t *e) struct ws_win *win; int i, action; - DNPRINTF(SWM_D_EVENT, "buttonpress: window 0x%x\n", e->event); + DNPRINTF(SWM_D_EVENT, "buttonpress: window 0x%x, detail: %u\n", + e->event, e->detail); if ((win = find_window(e->event)) == NULL) return; @@ -7048,23 +7064,12 @@ unmapnotify(xcb_unmap_notify_event_t *e) } } -void +/*void visibilitynotify(xcb_visibility_notify_event_t *e) { - int i, num_screens; - struct swm_region *r; - DNPRINTF(SWM_D_EVENT, "visibilitynotify: window: 0x%x\n", e->window); - - if (e->state == XCB_VISIBILITY_UNOBSCURED) { - num_screens = xcb_setup_roots_length(xcb_get_setup(conn)); - for (i = 0; i < num_screens; i++) - TAILQ_FOREACH(r, &screens[i].rl, entry) - if (e->window == WINID(r->bar)) - bar_update(); - } -} +}*/ void clientmessage(xcb_client_message_event_t *e) @@ -7077,20 +7082,20 @@ clientmessage(xcb_client_message_event_t *e) } DNPRINTF(SWM_D_EVENT, "clientmessage: window: 0x%x, type: %u\n", - e->window, e->response_type); + e->window, e->type); - if (e->response_type == ewmh[_NET_ACTIVE_WINDOW].atom) { + if (e->type == ewmh[_NET_ACTIVE_WINDOW].atom) { DNPRINTF(SWM_D_EVENT, "clientmessage: _NET_ACTIVE_WINDOW\n"); focus_win(win); } - if (e->response_type == ewmh[_NET_CLOSE_WINDOW].atom) { + 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); else xcb_kill_client(conn, win->id); } - if (e->response_type == ewmh[_NET_MOVERESIZE_WINDOW].atom) { + if (e->type == ewmh[_NET_MOVERESIZE_WINDOW].atom) { DNPRINTF(SWM_D_EVENT, "clientmessage: _NET_MOVERESIZE_WINDOW\n"); if (win->floating) { @@ -7111,7 +7116,7 @@ clientmessage(xcb_client_message_event_t *e) config_win(win, NULL); } } - if (e->response_type == ewmh[_NET_WM_STATE].atom) { + if (e->type == ewmh[_NET_WM_STATE].atom) { DNPRINTF(SWM_D_EVENT, "clientmessage: _NET_WM_STATE\n"); ewmh_update_win_state(win, e->data.data32[1], e->data.data32[0]); if (e->data.data32[2]) @@ -7556,6 +7561,11 @@ void event_handle(xcb_generic_event_t *evt) { uint8_t type = XCB_EVENT_RESPONSE_TYPE(evt); + + DNPRINTF(SWM_D_EVENT, "XCB Event: %s(%d)\n", + xcb_event_get_label(XCB_EVENT_RESPONSE_TYPE(evt)), + XCB_EVENT_RESPONSE_TYPE(evt)); + switch (type) { #define EVENT(type, callback) case type: callback((void *)evt); return EVENT(0, event_error); @@ -7591,7 +7601,7 @@ event_handle(xcb_generic_event_t *evt) /*EVENT(XCB_SELECTION_NOTIFY, );*/ /*EVENT(XCB_SELECTION_REQUEST, );*/ EVENT(XCB_UNMAP_NOTIFY, unmapnotify); - EVENT(XCB_VISIBILITY_NOTIFY, visibilitynotify); + /*EVENT(XCB_VISIBILITY_NOTIFY, visibilitynotify);*/ #undef EVENT } if (type - xrandr_eventbase == XCB_RANDR_SCREEN_CHANGE_NOTIFY) @@ -7603,14 +7613,16 @@ main(int argc, char *argv[]) { struct swm_region *r, *rr; struct ws_win *winfocus = NULL; - struct timeval tv; union arg a; char conf[PATH_MAX], *cfile = NULL; struct stat sb; int xfd, i, num_screens; - fd_set rd; struct sigaction sact; xcb_generic_event_t *evt; +#if 0 + struct timeval tv; + fd_set rd; +#endif time_started = time(NULL); @@ -7669,8 +7681,7 @@ main(int argc, char *argv[]) /* flush all events */ while ((evt = xcb_poll_for_event(conn))) { - uint8_t type = XCB_EVENT_RESPONSE_TYPE(evt); - if (type == 0) + if (XCB_EVENT_RESPONSE_TYPE(evt) == 0) event_handle(evt); free(evt); } @@ -7754,9 +7765,6 @@ noconfig: while (running) { while ((evt = xcb_poll_for_event(conn))) { - DNPRINTF(SWM_D_EVENT, "XCB Event: %s(%d)\n", - xcb_event_get_label(XCB_EVENT_RESPONSE_TYPE(evt)), - XCB_EVENT_RESPONSE_TYPE(evt)); if (running == 0) goto done; event_handle(evt); @@ -7783,6 +7791,7 @@ noconfig: continue; } +#if 0 FD_ZERO(&rd); FD_SET(xfd, &rd); tv.tv_sec = 1; @@ -7790,6 +7799,7 @@ noconfig: if (select(xfd + 1, &rd, NULL, NULL, &tv) == -1) if (errno != EINTR) DNPRINTF(SWM_D_MISC, "select failed"); +#endif if (restart_wm == 1) restart(NULL, NULL); if (search_resp == 1)