#define SWM_DEBUG
#ifdef SWM_DEBUG
-#define DPRINTF(x...) do { if (swm_debug) fprintf(stderr, x); } while (0)
-#define DNPRINTF(n,x...) do { if (swm_debug & n) fprintf(stderr, x); } while (0)
+#define DPRINTF(x...) do { \
+ if (swm_debug) \
+ fprintf(stderr, x); \
+} while (0)
+#define DNPRINTF(n,x...) do { \
+ if (swm_debug & n) { \
+ fprintf(stderr, "%ld ", (long)(time(NULL) - time_started)); \
+ fprintf(stderr, x); \
+ } \
+} while (0)
#define SWM_D_MISC 0x0001
#define SWM_D_EVENT 0x0002
#define SWM_D_WS 0x0004
int disable_border = 0;
int border_width = 1;
int verbose_layout = 0;
+time_t time_started;
pid_t bar_pid;
XFontSet bar_fs;
XFontSetExtents *bar_fs_extents;
XCB_CONFIG_WINDOW_STACK_MODE, &val);
xcb_map_window(conn, win);
- xcb_flush(conn);
}
xcb_atom_t
void
ewmh_autoquirk(struct ws_win *win)
{
- int i;
- unsigned long n;
- xcb_atom_t type;
+ uint32_t i, n;
+ xcb_atom_t *type;
xcb_get_property_cookie_t c;
xcb_get_property_reply_t *r;
c = xcb_get_property(conn, False, win->id,
- ewmh[_NET_WM_WINDOW_TYPE].atom, XCB_ATOM_ATOM, 0, (~0L));
+ ewmh[_NET_WM_WINDOW_TYPE].atom, XCB_ATOM_ATOM, 0, UINT32_MAX);
r = xcb_get_property_reply(conn, c, NULL);
if (!r)
return;
- n = xcb_get_property_value_length(r);
+ n = xcb_get_property_value_length(r);
+ type = xcb_get_property_value(r);
+
for (i = 0; i < n; i++) {
- type = *((xcb_atom_t *)xcb_get_property_value(r));
- if (type == ewmh[_NET_WM_WINDOW_TYPE_NORMAL].atom)
+ if (type[i] == ewmh[_NET_WM_WINDOW_TYPE_NORMAL].atom)
break;
- if (type == ewmh[_NET_WM_WINDOW_TYPE_DOCK].atom ||
- type == ewmh[_NET_WM_WINDOW_TYPE_TOOLBAR].atom ||
- type == ewmh[_NET_WM_WINDOW_TYPE_UTILITY].atom) {
+ if (type[i] == ewmh[_NET_WM_WINDOW_TYPE_DOCK].atom ||
+ type[i] == ewmh[_NET_WM_WINDOW_TYPE_TOOLBAR].atom ||
+ type[i] == ewmh[_NET_WM_WINDOW_TYPE_UTILITY].atom) {
win->floating = 1;
win->quirks = SWM_Q_FLOAT | SWM_Q_ANYWHERE;
break;
}
- if (type == ewmh[_NET_WM_WINDOW_TYPE_SPLASH].atom ||
- type == ewmh[_NET_WM_WINDOW_TYPE_DIALOG].atom) {
+ if (type[i] == ewmh[_NET_WM_WINDOW_TYPE_SPLASH].atom ||
+ type[i] == ewmh[_NET_WM_WINDOW_TYPE_DIALOG].atom) {
win->floating = 1;
win->quirks = SWM_Q_FLOAT;
break;
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 *);
stack();
/* must be after stack */
bar_update();
+
+ xcb_flush(conn);
}
void
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);
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,
else
strlcpy(bar_vertext, "", sizeof bar_vertext);
bar_update();
+
+ xcb_flush(conn);
}
void
if (unmap_old)
TAILQ_FOREACH(win, &old_ws->winlist, entry)
unmap_window(win);
+
+ xcb_flush(conn);
}
void
sort_windows(wl);
stack();
+
+ xcb_flush(conn);
}
void
}
focus_magic(winfocus);
+
+ xcb_flush(conn);
}
void
stack();
bar_update();
+
+ xcb_flush(conn);
}
void
/* bring floaters back to top */
if (r->ws->always_raise == 0)
stack();
+
+ xcb_flush(conn);
}
void
r->ws->focus = NULL;
a.id = SWM_ARG_ID_FOCUSCUR;
focus(r, &a);
+
+ xcb_flush(conn);
}
char *
}
fclose(lfile);
+ xcb_flush(conn);
}
void
}
fclose(lfile);
+
+ xcb_flush(conn);
}
void
else
if (r->ws->focus->can_delete)
client_msg(r->ws->focus, adelete);
+
+ xcb_flush(conn);
}
a.id = SWM_ARG_ID_FOCUSCUR;
focus(win->ws->r, &a);
}
+
+ xcb_flush(conn);
}
void
void
resize(struct ws_win *win, union arg *args)
{
- xcb_timestamp_t time = 0;
+ xcb_timestamp_t timestamp = 0;
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;
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);
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;
constrain_window(win, r, 1);
/* not free, don't sync more than 120 times / second */
- if ((mne->time - time) > (1000 / 120) ) {
- time = mne->time;
+ if ((mne->time - timestamp) > (1000 / 120) ) {
+ timestamp = mne->time;
do_sync();
update_window(win);
}
}
free(evt);
}
- if (time) {
+ if (timestamp) {
do_sync();
update_window(win);
}
xcb_close_font(conn, cursor_font);
free(gpr);
free(xpr);
+ DNPRINTF(SWM_D_EVENT, "resize: done\n");
}
void
void
move(struct ws_win *win, union arg *args)
{
- xcb_timestamp_t time = 0;
- int move_step = 0, buttonrelease;
+ xcb_timestamp_t timestamp = 0;
+ int move_step = 0, moving;
struct swm_region *r = NULL;
xcb_font_t cursor_font;
xcb_cursor_t cursor;
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 */
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;
constrain_window(win, r, 0);
/* not free, don't sync more than 120 times / second */
- if ((mne->time - time) > (1000 / 120) ) {
- time = mne->time;
+ if ((mne->time - timestamp) > (1000 / 120) ) {
+ timestamp = mne->time;
do_sync();
update_window(win);
}
}
free(evt);
}
- if (time) {
+ if (timestamp) {
do_sync();
update_window(win);
}
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
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
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;
/* resend unmap because we ated it */
xcb_unmap_window(conn, e->window);
+ xcb_flush(conn);
}
}
-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)
}
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) {
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])
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);
/*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)
{
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);
start_argv = argv;
warnx("Welcome to spectrwm V%s Build: %s", SPECTRWM_VERSION, buildstr);
/* 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);
}
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);
continue;
}
+#if 0
FD_ZERO(&rd);
FD_SET(xfd, &rd);
tv.tv_sec = 1;
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)