#include <X11/Xlib-xcb.h>
#include <xcb/randr.h>
#include <xcb/xcb_atom.h>
+#include <xcb/xcb_aux.h>
+#include <xcb/xcb_event.h>
#include <xcb/xcb_icccm.h>
#include <xcb/xcb_keysyms.h>
+#include <xcb/xtest.h>
#include <X11/Xproto.h>
#include <X11/Xutil.h>
#include <X11/extensions/Xrandr.h>
#define xcb_icccm_get_wm_protocols xcb_get_wm_protocols
#define xcb_icccm_get_wm_protocols_reply xcb_get_wm_protocols_reply
#define xcb_icccm_get_wm_protocols_reply_t xcb_get_wm_protocols_reply_t
+#define xcb_icccm_get_wm_protocols_reply_wipe xcb_get_wm_protocols_reply_wipe
#define xcb_icccm_get_wm_transient_for xcb_get_wm_transient_for
#define xcb_icccm_get_wm_transient_for_reply xcb_get_wm_transient_for_reply
#define xcb_icccm_wm_hints_t xcb_wm_hints_t
#endif
-/*#define SWM_DEBUG*/
+#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
volatile sig_atomic_t running = 1;
volatile sig_atomic_t restart_wm = 0;
int outputs = 0;
-int last_focus_event = FocusOut;
+/*int last_focus_event = FocusOut;*/
int (*xerrorxlib)(Display *, XErrorEvent *);
int other_wm;
int ss_enabled = 0;
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;
void spawn_select(struct swm_region *, union arg *, char *, int *);
char *get_win_name(xcb_window_t);
xcb_atom_t get_atom_from_string(const char *);
-void map_window_raised(xcb_window_t);
-void do_sync(void);
+void map_window_raised(xcb_window_t);
+void do_sync(void);
xcb_screen_t *get_screen(int);
-int parse_rgb(const char *, uint16_t *, uint16_t *, uint16_t *);
+int parse_rgb(const char *, uint16_t *, uint16_t *, uint16_t *);
+void event_handle(xcb_generic_event_t *);
int
parse_rgb(const char *rgb, uint16_t *rr, uint16_t *gg, uint16_t *bb)
if (sscanf(rgb, "rgb:%x/%x/%x", &tmpr, &tmpg, &tmpb) != 3)
return (-1);
-
+
*rr = tmpr << 8;
*gg = tmpg << 8;
*bb = tmpb << 8;
uint32_t val = XCB_STACK_MODE_ABOVE;
xcb_configure_window(conn, win,
- XCB_CONFIG_WINDOW_STACK_MODE, &val);
+ XCB_CONFIG_WINDOW_STACK_MODE, &val);
xcb_map_window(conn, win);
xcb_flush(conn);
if (newv)
xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->id,
- iprop, XCB_ATOM_INTEGER, 32, 1, &v);
+ iprop, XCB_ATOM_INTEGER, 32, 1, &v);
else
xcb_delete_property(conn, win->id, iprop);
}
goto out;
pr = xcb_get_property_reply(conn,
- xcb_get_property(conn, False, win->id, iprop, XCB_ATOM_INTEGER,
- 0, 1),
- NULL);
+ xcb_get_property(conn, False, win->id, iprop, XCB_ATOM_INTEGER,
+ 0, 1), NULL);
if (!pr)
goto out;
if (pr->type != XCB_ATOM_INTEGER || pr->format != 32)
goto out;
v = *((int32_t *)xcb_get_property_value(pr));
out:
- if (pr)
+ if (pr)
free(pr);
return (v);
}
xcb_delete_property(conn, screens[i].root, sup_list);
for (j = 0; j < LENGTH(ewmh); j++)
xcb_change_property(conn, XCB_PROP_MODE_APPEND,
- screens[i].root, sup_list, XCB_ATOM_ATOM, 32, 1,
- &ewmh[j].atom);
+ screens[i].root, sup_list, XCB_ATOM_ATOM, 32, 1,
+ &ewmh[j].atom);
}
}
for (i = 0; i < num_screens; i++) {
/* Get the support check window and destroy it */
pc = xcb_get_property(conn, False, screens[i].root, sup_check,
- XCB_ATOM_WINDOW, 0, 1);
+ XCB_ATOM_WINDOW, 0, 1);
pr = xcb_get_property_reply(conn, pc, NULL);
if (pr) {
id = *((xcb_window_t *)xcb_get_property_value(pr));
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, (~0L));
r = xcb_get_property_reply(conn, c, NULL);
if (!r)
return;
}
xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->id,
- ewmh[_NET_WM_ALLOWED_ACTIONS].atom, XCB_ATOM_ATOM, 32, 1,
- actions);
+ ewmh[_NET_WM_ALLOWED_ACTIONS].atom, XCB_ATOM_ATOM, 32, 1, actions);
}
#define _NET_WM_STATE_REMOVE 0 /* remove/unset property */
if (win->ewmh_flags & EWMH_F_FULLSCREEN)
xcb_change_property(conn, XCB_PROP_MODE_APPEND, win->id,
- ewmh[_NET_WM_STATE].atom, XCB_ATOM_ATOM, 32, 1,
- &ewmh[_NET_WM_STATE_FULLSCREEN].atom);
+ ewmh[_NET_WM_STATE].atom, XCB_ATOM_ATOM, 32, 1,
+ &ewmh[_NET_WM_STATE_FULLSCREEN].atom);
if (win->ewmh_flags & EWMH_F_SKIP_PAGER)
xcb_change_property(conn, XCB_PROP_MODE_APPEND, win->id,
- ewmh[_NET_WM_STATE].atom, XCB_ATOM_ATOM, 32, 1,
- &ewmh[_NET_WM_STATE_SKIP_PAGER].atom);
+ ewmh[_NET_WM_STATE].atom, XCB_ATOM_ATOM, 32, 1,
+ &ewmh[_NET_WM_STATE_SKIP_PAGER].atom);
if (win->ewmh_flags & EWMH_F_SKIP_TASKBAR)
xcb_change_property(conn, XCB_PROP_MODE_APPEND, win->id,
- ewmh[_NET_WM_STATE].atom, XCB_ATOM_ATOM, 32, 1,
- &ewmh[_NET_WM_STATE_SKIP_TASKBAR].atom);
+ ewmh[_NET_WM_STATE].atom, XCB_ATOM_ATOM, 32, 1,
+ &ewmh[_NET_WM_STATE_SKIP_TASKBAR].atom);
if (win->ewmh_flags & EWMH_F_ABOVE)
xcb_change_property(conn, XCB_PROP_MODE_APPEND, win->id,
- ewmh[_NET_WM_STATE].atom, XCB_ATOM_ATOM, 32, 1,
- &ewmh[_NET_WM_STATE_ABOVE].atom);
+ ewmh[_NET_WM_STATE].atom, XCB_ATOM_ATOM, 32, 1,
+ &ewmh[_NET_WM_STATE_ABOVE].atom);
if (win->ewmh_flags & SWM_F_MANUAL)
xcb_change_property(conn, XCB_PROP_MODE_APPEND, win->id,
- ewmh[_NET_WM_STATE].atom, XCB_ATOM_ATOM, 32, 1,
- &ewmh[_SWM_WM_STATE_MANUAL].atom);
+ ewmh[_NET_WM_STATE].atom, XCB_ATOM_ATOM, 32, 1,
+ &ewmh[_SWM_WM_STATE_MANUAL].atom);
}
void
win->ewmh_flags |= SWM_F_MANUAL;
c = xcb_get_property(conn, False, win->id, ewmh[_NET_WM_STATE].atom,
- XCB_ATOM_ATOM, 0, (~0L));
+ XCB_ATOM_ATOM, 0, (~0L));
r = xcb_get_property_reply(conn, c, NULL);
if (!r)
return;
/* events */
#ifdef SWM_DEBUG
-char *
-geteventname(XEvent *e)
-{
- char *name = NULL;
-
- switch (e->type) {
- case KeyPress:
- name = "KeyPress";
- break;
- case KeyRelease:
- name = "KeyRelease";
- break;
- case ButtonPress:
- name = "ButtonPress";
- break;
- case ButtonRelease:
- name = "ButtonRelease";
- break;
- case MotionNotify:
- name = "MotionNotify";
- break;
- case EnterNotify:
- name = "EnterNotify";
- break;
- case LeaveNotify:
- name = "LeaveNotify";
- break;
- case FocusIn:
- name = "FocusIn";
- break;
- case FocusOut:
- name = "FocusOut";
- break;
- case KeymapNotify:
- name = "KeymapNotify";
- break;
- case Expose:
- name = "Expose";
- break;
- case GraphicsExpose:
- name = "GraphicsExpose";
- break;
- case NoExpose:
- name = "NoExpose";
- break;
- case VisibilityNotify:
- name = "VisibilityNotify";
- break;
- case CreateNotify:
- name = "CreateNotify";
- break;
- case DestroyNotify:
- name = "DestroyNotify";
- break;
- case UnmapNotify:
- name = "UnmapNotify";
- break;
- case MapNotify:
- name = "MapNotify";
- break;
- case MapRequest:
- name = "MapRequest";
- break;
- case ReparentNotify:
- name = "ReparentNotify";
- break;
- case ConfigureNotify:
- name = "ConfigureNotify";
- break;
- case ConfigureRequest:
- name = "ConfigureRequest";
- break;
- case GravityNotify:
- name = "GravityNotify";
- break;
- case ResizeRequest:
- name = "ResizeRequest";
- break;
- case CirculateNotify:
- name = "CirculateNotify";
- break;
- case CirculateRequest:
- name = "CirculateRequest";
- break;
- case PropertyNotify:
- name = "PropertyNotify";
- break;
- case SelectionClear:
- name = "SelectionClear";
- break;
- case SelectionRequest:
- name = "SelectionRequest";
- break;
- case SelectionNotify:
- name = "SelectionNotify";
- break;
- case ColormapNotify:
- name = "ColormapNotify";
- break;
- case ClientMessage:
- name = "ClientMessage";
- break;
- case MappingNotify:
- name = "MappingNotify";
- break;
- default:
- name = "Unknown";
- }
-
- return (name);
-}
-
-char *
-xrandr_geteventname(XEvent *e)
-{
- char *name = NULL;
-
- switch(e->type - xrandr_eventbase) {
- case RRScreenChangeNotify:
- name = "RRScreenChangeNotify";
- break;
- default:
- name = "Unknown";
- }
-
- return (name);
-}
-
void
dumpwins(struct swm_region *r, union arg *args)
{
wa = xcb_get_window_attributes_reply(conn, c, NULL);
if (wa) {
warnx("window: 0x%x, map_state: %d, state: %u, "
- "transient: 0x%x", win->id, wa->map_state,
- state, win->transient);
+ "transient: 0x%x", win->id, wa->map_state,
+ state, win->transient);
free(wa);
} else
warnx("window: 0x%x, failed xcb_get_window_attributes",
wa = xcb_get_window_attributes_reply(conn, c, NULL);
if (wa) {
warnx("window: 0x%x, map_state: %d, state: %u, "
- "transient: 0x%x", win->id, wa->map_state,
- state, win->transient);
+ "transient: 0x%x", win->id, wa->map_state,
+ state, win->transient);
free(wa);
} else
warnx("window: 0x%x, failed xcb_get_window_attributes",
}
#endif /* SWM_DEBUG */
-void expose(XEvent *);
-void keypress(XEvent *);
-void buttonpress(XEvent *);
-void configurerequest(XEvent *);
-void configurenotify(XEvent *);
-void destroynotify(XEvent *);
-void enternotify(XEvent *);
-void focusevent(XEvent *);
-void mapnotify(XEvent *);
-void mappingnotify(XEvent *);
-void maprequest(XEvent *);
-void propertynotify(XEvent *);
-void unmapnotify(XEvent *);
-void visibilitynotify(XEvent *);
-void clientmessage(XEvent *);
-
-void (*handler[LASTEvent])(XEvent *) = {
- [Expose] = expose,
- [KeyPress] = keypress,
- [ButtonPress] = buttonpress,
- [ConfigureRequest] = configurerequest,
- [ConfigureNotify] = configurenotify,
- [DestroyNotify] = destroynotify,
- [EnterNotify] = enternotify,
- [FocusIn] = focusevent,
- [FocusOut] = focusevent,
- [MapNotify] = mapnotify,
- [MappingNotify] = mappingnotify,
- [MapRequest] = maprequest,
- [PropertyNotify] = propertynotify,
- [UnmapNotify] = unmapnotify,
- [VisibilityNotify] = visibilitynotify,
- [ClientMessage] = clientmessage,
-};
+void event_error(xcb_generic_error_t *);
+void expose(xcb_expose_event_t *);
+void keypress(xcb_key_press_event_t *);
+void buttonpress(xcb_button_press_event_t *);
+void configurerequest(xcb_configure_request_event_t *);
+void configurenotify(xcb_configure_notify_event_t *);
+void destroynotify(xcb_destroy_notify_event_t *);
+void enternotify(xcb_enter_notify_event_t *);
+void mapnotify(xcb_map_notify_event_t *);
+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 clientmessage(xcb_client_message_event_t *);
+void screenchange(xcb_randr_screen_change_notify_event_t *);
void
sighdlr(int sig)
warnx("could not parse rgb %s", colorname);
else {
cr = xcb_alloc_color_reply(conn,
- xcb_alloc_color(conn, cmap, rr, gg, bb),
- NULL);
+ xcb_alloc_color(conn, cmap, rr, gg, bb),
+ NULL);
if (cr) {
result = cr->pixel;
free(cr);
} else {
nr = xcb_alloc_named_color_reply(conn,
xcb_alloc_named_color(conn, cmap, strlen(colorname),
- colorname),
- NULL);
+ colorname), NULL);
if (!nr) {
strlcat(cname, colorname + 2, sizeof cname - 1);
nr = xcb_alloc_named_color_reply(conn,
- xcb_alloc_named_color(conn, cmap, strlen(cname),
- cname),
- NULL);
+ xcb_alloc_named_color(conn, cmap, strlen(cname),
+ cname), NULL);
}
if (nr) {
result = nr->pixel;
gcv[0] = r->s->c[SWM_S_COLOR_BAR].color;
xcb_change_gc(conn, r->s->bar_gc, XCB_GC_FOREGROUND, gcv);
xcb_poly_fill_rectangle(conn, r->bar->buffer, r->s->bar_gc,
- sizeof(rect), &rect);
+ sizeof(rect), &rect);
/* draw back buffer */
+ gcv[0] = r->s->c[SWM_S_COLOR_BAR].color;
+ 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);
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);
+ (bar_fs_extents->max_logical_extent.height - lbox.height) / 2 -
+ lbox.y, s);
/* blt */
xcb_copy_area(conn, r->bar->buffer, r->bar->id, r->s->bar_gc, 0, 0,
- 0, 0, WIDTH(r->bar), HEIGHT(r->bar));
+ 0, 0, WIDTH(r->bar), HEIGHT(r->bar));
}
void
TAILQ_FOREACH(win, &screens[i].ws[j].winlist, entry) {
c = xcb_icccm_get_wm_hints(conn, win->id);
if (xcb_icccm_get_wm_hints_reply(conn, c,
- &hints, NULL) == 0)
+ &hints, NULL) == 0)
continue;
if (hints.flags & XCB_ICCCM_WM_HINT_X_URGENCY)
urgent[j] = 1;
wa[0] = screens[i].c[SWM_S_COLOR_BAR].color;
wa[1] = screens[i].c[SWM_S_COLOR_BAR_BORDER].color;
xcb_change_window_attributes(conn, r->bar->id,
- XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL, wa);
+ XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL, wa);
}
bar_update();
}
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);
bar_fs = NULL;
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;
- xcb_create_window(conn, screen->root_depth, 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,
- screen->root_visual, XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL,
- wa);
+ 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
+ | 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,
- WIDTH(r->bar), HEIGHT(r->bar));
+ WIDTH(r->bar), HEIGHT(r->bar));
xcb_randr_select_input(conn, r->bar->id,
- XCB_RANDR_NOTIFY_MASK_OUTPUT_CHANGE);
+ XCB_RANDR_NOTIFY_MASK_OUTPUT_CHANGE);
if (bar_enabled)
map_window_raised(r->bar->id);
}
void
-drain_enter_notify(void)
-{
- int i = 0;
- XEvent cne;
-
- while (XCheckMaskEvent(display, EnterWindowMask, &cne))
- i++;
-
- DNPRINTF(SWM_D_EVENT, "drain_enter_notify: drained: %d\n", i);
-}
-
-void
set_win_state(struct ws_win *win, uint16_t state)
{
uint16_t data[2] = { state, XCB_ATOM_NONE };
return;
xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->id, astate,
- astate, 32, 2, data);
+ astate, 32, 2, data);
}
uint16_t
free(r);
}
+ DNPRINTF(SWM_D_MISC, "getstate property: win 0x%x state %u\n", w,
+ result);
return (result);
}
ev.data.data32[1] = XCB_CURRENT_TIME;
xcb_send_event(conn, False, win->id,
- XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
- xcb_flush(conn);
+ XCB_EVENT_MASK_NO_EVENT, (const char *)&ev);
}
/* synthetic response to a ConfigureRequest when not making a change */
void
-config_win(struct ws_win *win, XConfigureRequestEvent *ev)
+config_win(struct ws_win *win, xcb_configure_request_event_t *ev)
{
xcb_configure_notify_event_t ce;
ce.x += BORDER(win) - ev->border_width;
ce.y += BORDER(win) - ev->border_width;
ce.border_width = ev->border_width;
- ce.above_sibling = ev->above;
+ ce.above_sibling = ev->sibling;
}
DNPRINTF(SWM_D_MISC, "config_win: ewmh: %s, window: 0x%x, (x,y) w x h: "
xcb_send_event(conn, False, win->id, XCB_EVENT_MASK_STRUCTURE_NOTIFY,
(char *)&ce);
- xcb_flush(conn);
}
int
xcb_unmap_window(conn, win->id);
xcb_change_window_attributes(conn, win->id,
- XCB_CW_BORDER_PIXEL, &win->s->c[SWM_S_COLOR_UNFOCUS].color);
+ XCB_CW_BORDER_PIXEL, &win->s->c[SWM_S_COLOR_UNFOCUS].color);
}
void
keycode = xcb_key_symbols_get_keycode(syms, keysym);
+ DNPRINTF(SWM_D_MISC, "fake_keypress: win 0x%x keycode %u\n",
+ win->id, *keycode);
+
+ bzero(&event, sizeof(event));
event.event = win->id;
event.root = win->s->root;
event.child = XCB_WINDOW_NONE;
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, (char *)&event);
event.response_type = XCB_KEY_RELEASE;
xcb_send_event(conn, True, win->id,
- XCB_EVENT_MASK_KEY_RELEASE, (char *)&event);
- xcb_flush(conn);
+ XCB_EVENT_MASK_KEY_RELEASE, (char *)&event);
}
void
break;
qpr = xcb_query_pointer_reply(conn, xcb_query_pointer(conn,
- screens[i].root), NULL);
+ screens[i].root), NULL);
if (qpr) {
DNPRINTF(SWM_D_MISC, "root_to_region: pointer: (%d,%d)\n",
void
unfocus_win(struct ws_win *win)
{
- XEvent cne;
xcb_window_t none = XCB_WINDOW_NONE;
DNPRINTF(SWM_D_FOCUS, "unfocus_win: window: 0x%x\n", WINID(win));
win->ws->focus_prev = NULL;
}
- /* drain all previous unfocus events */
- while (XCheckTypedEvent(display, FocusOut, &cne) == True)
- ;
-
grabbuttons(win, 0);
xcb_change_window_attributes(conn, win->id, XCB_CW_BORDER_PIXEL,
- &win->ws->r->s->c[SWM_S_COLOR_UNFOCUS].color);
+ &win->ws->r->s->c[SWM_S_COLOR_UNFOCUS].color);
xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->s->root,
- ewmh[_NET_ACTIVE_WINDOW].atom, XCB_ATOM_WINDOW, 32, 1,
- &none);
+ ewmh[_NET_ACTIVE_WINDOW].atom, XCB_ATOM_WINDOW, 32, 1, &none);
}
void
void
focus_win(struct ws_win *win)
{
- XEvent cne;
struct ws_win *cfw = NULL;
xcb_get_input_focus_cookie_t c;
xcb_get_input_focus_reply_t *r;
unfocus_win(cfw);
else {
/* use larger hammer since the window was killed somehow */
- TAILQ_FOREACH(cfw, &win->ws->winlist, entry)
+ /* TAILQ_FOREACH(cfw, &win->ws->winlist, entry)
if (cfw->ws && cfw->ws->r && cfw->ws->r->s)
xcb_change_window_attributes(conn, cfw->id,
- XCB_CW_BORDER_PIXEL,
- &cfw->ws->r->s->c[SWM_S_COLOR_UNFOCUS].color);
+ XCB_CW_BORDER_PIXEL,
+ &cfw->ws->r->s->c[SWM_S_COLOR_UNFOCUS].color);*/
}
win->ws->focus = win;
if (win->ws->r != NULL) {
- /* drain all previous focus events */
- while (XCheckTypedEvent(display, FocusIn, &cne) == True)
- ;
-
if (win->java == 0)
xcb_set_input_focus(conn, XCB_INPUT_FOCUS_PARENT,
- win->id, XCB_CURRENT_TIME);
+ win->id, XCB_CURRENT_TIME);
grabbuttons(win, 1);
xcb_change_window_attributes(conn, win->id,
XCB_CW_BORDER_PIXEL,
map_window_raised(win->id);
xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->s->root,
- ewmh[_NET_ACTIVE_WINDOW].atom, XCB_ATOM_WINDOW, 32, 1,
- &win->id);
+ ewmh[_NET_ACTIVE_WINDOW].atom, XCB_ATOM_WINDOW, 32, 1,
+ &win->id);
}
bar_update();
if (unmap_old)
TAILQ_FOREACH(win, &old_ws->winlist, entry)
unmap_window(win);
-
- if (focus_mode == SWM_FOCUS_DEFAULT)
- drain_enter_notify();
}
void
x = X(rr) + 1;
y = Y(rr) + 1 + (bar_enabled ? bar_height : 0);
xcb_warp_pointer(conn, XCB_WINDOW_NONE, rr->s[i].root, 0, 0, 0, 0,
- x, y);
+ x, y);
a.id = SWM_ARG_ID_FOCUSCUR;
focus(rr, &a);
x = X(rr->ws->focus) + 1;
y = Y(rr->ws->focus) + 1;
xcb_warp_pointer(conn, XCB_WINDOW_NONE, rr->s[i].root, 0, 0, 0,
- 0, x, y);
+ 0, x, y);
}
}
ws->cur_layout = &layouts[0];
stack();
- if (focus_mode == SWM_FOCUS_DEFAULT)
- drain_enter_notify();
+
a.id = SWM_ARG_ID_FOCUSCUR;
+
focus(r, &a);
}
if (font_adjusted)
font_adjusted--;
- if (focus_mode == SWM_FOCUS_DEFAULT)
- drain_enter_notify();
-
DNPRINTF(SWM_D_STACK, "stack: end\n");
}
DNPRINTF(SWM_D_PROP, "send_to_ws: set property: _SWM_WS: %s\n",
ws_idx_str);
xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->id,
- ws_idx_atom, XCB_ATOM_STRING, 8, strlen(ws_idx_str),
- ws_idx_str);
+ ws_idx_atom, XCB_ATOM_STRING, 8, strlen(ws_idx_str),
+ ws_idx_str);
}
stack();
void
pressbutton(struct swm_region *r, union arg *args)
{
- XTestFakeButtonEvent(display, args->id, True, CurrentTime);
- XTestFakeButtonEvent(display, args->id, False, CurrentTime);
+ xcb_test_fake_input(conn, XCB_BUTTON_PRESS, args->id,
+ XCB_CURRENT_TIME, XCB_WINDOW_NONE, 0, 0, 0);
+ xcb_test_fake_input(conn, XCB_BUTTON_RELEASE, args->id,
+ XCB_CURRENT_TIME, XCB_WINDOW_NONE, 0, 0, 0);
}
void
unmap_window(r->ws->focus);
update_iconic(r->ws->focus, 1);
stack();
- if (focus_mode == SWM_FOCUS_DEFAULT)
- drain_enter_notify();
+
r->ws->focus = NULL;
a.id = SWM_ARG_ID_FOCUSCUR;
focus(r, &a);
struct ws_win *win = NULL;
struct search_window *sw = NULL;
xcb_window_t w;
- uint32_t gcv[1], wa[2];
+ uint32_t gcv[3], wa[2];
int i;
char s[8];
FILE *lfile;
size_t len;
XRectangle ibox, lbox;
- xcb_screen_t *screen;
DNPRINTF(SWM_D_MISC, "search_win\n");
search_r = r;
}
sw->idx = i;
sw->win = win;
- screen = get_screen(sw->idx);
snprintf(s, sizeof s, "%d", i);
len = strlen(s);
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;
- xcb_create_window(conn, screen->root_depth, w, win->id,
- 0, 0, lbox.width + 4,
- bar_fs_extents->max_logical_extent.height, 1,
- XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual,
- XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL, wa);
-
+ 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);
+
sw->indicator = w;
TAILQ_INSERT_TAIL(&search_wl, sw, entry);
sw->gc = xcb_generate_id(conn);
- gcv[0] = r->s->c[SWM_S_COLOR_BAR].color;
- xcb_create_gc(conn, sw->gc, w, XCB_GC_FOREGROUND, gcv);
+ gcv[0] = r->s->c[SWM_S_COLOR_BAR].color;
+ gcv[1] = r->s->c[SWM_S_COLOR_FOCUS].color;
+ gcv[2] = 0;
+ xcb_create_gc(conn, sw->gc, w, XCB_GC_FOREGROUND |
+ XCB_GC_BACKGROUND | XCB_GC_GRAPHICS_EXPOSURES, gcv);
map_window_raised(w);
xcb_image_text_8(conn, len, w, sw->gc, 2,
(bar_fs_extents->max_logical_extent.height -
lbox.height) / 2 - lbox.y, s);
+ DNPRINTF(SWM_D_MISC, "search_win: mapped window: 0x%x\n", w);
+
fprintf(lfile, "%d\n", i);
i++;
}
_NET_WM_STATE_TOGGLE);
stack();
- if (focus_mode == SWM_FOCUS_DEFAULT)
- drain_enter_notify();
if (win == win->ws->focus) {
a.id = SWM_ARG_ID_FOCUSCUR;
void
resize(struct ws_win *win, union arg *args)
{
- XEvent ev;
- Time 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;
+ int top = 0, left = 0, buttonrelease;
int dx, dy;
unsigned int shape; /* cursor style */
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;
if (win == NULL)
return;
return;
}
- if (focus_mode == SWM_FOCUS_DEFAULT)
- drain_enter_notify();
-
/* get cursor offset from window root */
xpr = xcb_query_pointer_reply(conn, xcb_query_pointer(conn, win->id),
- NULL);
+ NULL);
if (!xpr)
return;
-
+
g = win->g;
if (xpr->win_x < WIDTH(win) / 2)
cursor = xcb_generate_id(conn);
xcb_create_glyph_cursor(conn, cursor, cursor_font, cursor_font,
- shape, shape + 1, 0, 0, 0, 0xffff, 0xffff, 0xffff);
+ shape, shape + 1, 0, 0, 0, 0xffff, 0xffff, 0xffff);
- gpr = xcb_grab_pointer_reply(conn,
- xcb_grab_pointer(conn, False, win->id, MOUSEMASK,
- XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC, XCB_WINDOW_NONE,
- cursor, XCB_CURRENT_TIME),
- NULL);
+ gpc = xcb_grab_pointer(conn, False, 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;
}
- do {
+ xcb_flush(conn);
+ buttonrelease = 0;
+ while ((evt = xcb_poll_for_event(conn)) && buttonrelease != 1) {
+ /*
XMaskEvent(display, MOUSEMASK | ExposureMask |
SubstructureRedirectMask, &ev);
- switch (ev.type) {
- case ConfigureRequest:
- case Expose:
- case MapRequest:
- handler[ev.type](&ev);
+ */
+ switch (XCB_EVENT_RESPONSE_TYPE(evt)) {
+ case XCB_BUTTON_RELEASE:
+ buttonrelease = 1;
break;
- case MotionNotify:
+ case XCB_MOTION_NOTIFY:
+ mne = (xcb_motion_notify_event_t *)evt;
/* cursor offset/delta from start of the operation */
- dx = ev.xmotion.x_root - xpr->root_x;
- dy = ev.xmotion.y_root - xpr->root_y;
+ dx = mne->root_x - xpr->root_x;
+ dy = mne->root_y - xpr->root_y;
/* vertical */
if (top)
constrain_window(win, r, 1);
/* not free, don't sync more than 120 times / second */
- if ((ev.xmotion.time - time) > (1000 / 120) ) {
- time = ev.xmotion.time;
+ if ((mne->time - timestamp) > (1000 / 120) ) {
+ timestamp = mne->time;
do_sync();
update_window(win);
}
break;
+ default:
+ event_handle(evt);
+ break;
}
- } while (ev.type != ButtonRelease);
- if (time) {
+ free(evt);
+ }
+ if (timestamp) {
do_sync();
update_window(win);
}
xcb_close_font(conn, cursor_font);
free(gpr);
free(xpr);
-
- /* drain events */
- drain_enter_notify();
}
void
void
move(struct ws_win *win, union arg *args)
{
- XEvent ev;
- Time time = 0;
- int move_step = 0;
+ xcb_timestamp_t timestamp = 0;
+ int move_step = 0, buttonrelease;
struct swm_region *r = NULL;
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;
if (win == NULL)
return;
cursor_font = xcb_generate_id(conn);
xcb_open_font(conn, cursor_font, strlen("cursor"), "cursor");
-
+
cursor = xcb_generate_id(conn);
xcb_create_glyph_cursor(conn, cursor, cursor_font, cursor_font,
XC_fleur, XC_fleur + 1, 0, 0, 0, 0xffff, 0xffff, 0xffff);
- gpr = xcb_grab_pointer_reply(conn,
- xcb_grab_pointer(conn, False, win->id, MOUSEMASK,
- XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC,
- XCB_WINDOW_NONE, cursor, XCB_CURRENT_TIME),
- NULL);
+ gpc = xcb_grab_pointer(conn, False, 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);
xcb_close_font(conn, cursor_font);
return;
}
- do {
+
+ xcb_flush(conn);
+ buttonrelease = 0;
+ while ((evt = xcb_poll_for_event(conn)) && buttonrelease != 1) {
+ /*
XMaskEvent(display, MOUSEMASK | ExposureMask |
SubstructureRedirectMask, &ev);
- switch (ev.type) {
- case ConfigureRequest:
- case Expose:
- case MapRequest:
- handler[ev.type](&ev);
+ */
+ switch (XCB_EVENT_RESPONSE_TYPE(evt)) {
+ case XCB_BUTTON_RELEASE:
+ buttonrelease = 1;
break;
- case MotionNotify:
- X(win) = ev.xmotion.x_root - qpr->win_x - border_width;
- Y(win) = ev.xmotion.y_root - qpr->win_y - border_width;
+ case XCB_MOTION_NOTIFY:
+ mne = (xcb_motion_notify_event_t *)evt;
+ X(win) = mne->root_x - qpr->win_x - border_width;
+ Y(win) = mne->root_y - qpr->win_y - border_width;
constrain_window(win, r, 0);
/* not free, don't sync more than 120 times / second */
- if ((ev.xmotion.time - time) > (1000 / 120) ) {
- time = ev.xmotion.time;
+ if ((mne->time - timestamp) > (1000 / 120) ) {
+ timestamp = mne->time;
do_sync();
update_window(win);
}
break;
+ default:
+ event_handle(evt);
+ break;
}
- } while (ev.type != ButtonRelease);
- if (time) {
+ free(evt);
+ }
+ 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);
-
- /* drain events */
- drain_enter_notify();
}
void
numlockmask = 0;
modmap_r = xcb_get_modifier_mapping_reply(conn,
- xcb_get_modifier_mapping(conn),
- NULL);
+ xcb_get_modifier_mapping(conn),
+ NULL);
if (modmap_r) {
modmap = xcb_get_modifier_mapping_keycodes(modmap_r);
for (i = 0; i < 8; i++) {
for (j = 0; j < modmap_r->keycodes_per_modifier; j++) {
kc = modmap[i * modmap_r->keycodes_per_modifier
- + j];
+ + j];
if (kc == *((xcb_keycode_t *)xcb_key_symbols_get_keycode(syms,
- XK_Num_Lock)))
+ XK_Num_Lock)))
numlockmask = (1 << i);
}
}
updatenumlockmask();
xcb_ungrab_button(conn, XCB_BUTTON_INDEX_ANY, win->id,
- XCB_BUTTON_MASK_ANY);
+ XCB_BUTTON_MASK_ANY);
if (focused) {
for (i = 0; i < LENGTH(buttons); i++)
if (buttons[i].action == client_click)
for (j = 0; j < LENGTH(modifiers); j++)
xcb_grab_button(conn, False, win->id,
- BUTTONMASK,
- XCB_GRAB_MODE_ASYNC,
- XCB_GRAB_MODE_SYNC,
- XCB_WINDOW_NONE,
- XCB_CURSOR_NONE,
- buttons[i].button,
- buttons[i].mask);
+ BUTTONMASK,
+ XCB_GRAB_MODE_ASYNC,
+ XCB_GRAB_MODE_SYNC,
+ XCB_WINDOW_NONE,
+ XCB_CURSOR_NONE,
+ buttons[i].button,
+ buttons[i].mask);
} else
xcb_grab_button(conn, False, win->id, BUTTONMASK,
- XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_SYNC,
- XCB_WINDOW_NONE, XCB_CURSOR_NONE, XCB_BUTTON_INDEX_ANY,
- XCB_BUTTON_MASK_ANY);
+ XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_SYNC, XCB_WINDOW_NONE,
+ XCB_CURSOR_NONE, XCB_BUTTON_INDEX_ANY, XCB_BUTTON_MASK_ANY);
}
const char *quirkname[] = {
/* parent doen't exist in our window list */
TAILQ_FOREACH(w, &ws->winlist, entry) {
if (xcb_icccm_get_wm_hints_reply(conn,
- xcb_icccm_get_wm_hints(conn, w->id),
- &wmh, NULL) != 1) {
+ xcb_icccm_get_wm_hints(conn, w->id),
+ &wmh, NULL) != 1) {
warnx("can't get hints for 0x%x", w->id);
continue;
}
tryharder:
apid = get_atom_from_string("_SWM_PID");
pc = xcb_get_property(conn, False, win, apid, XCB_ATOM_STRING,
- 0, SWM_PROPLEN);
+ 0, SWM_PROPLEN);
pr = xcb_get_property_reply(conn, pc, NULL);
if (!pr)
return (0);
if (ws_idx_atom) {
gpr = xcb_get_property_reply(conn,
xcb_get_property(conn, False, id, ws_idx_atom,
- XCB_ATOM_STRING, 0, SWM_PROPLEN),
+ XCB_ATOM_STRING, 0, SWM_PROPLEN),
NULL);
if (gpr) {
proplen = xcb_get_property_value_length(gpr);
if (prop) {
memcpy(prop,
xcb_get_property_value(gpr),
- proplen);
+ proplen);
prop[proplen] = '\0';
}
}
}
}
win->wa = xcb_get_geometry_reply(conn,
- xcb_get_geometry(conn, id),
- NULL);
+ xcb_get_geometry(conn, id),
+ NULL);
xcb_icccm_get_wm_normal_hints_reply(conn,
- xcb_icccm_get_wm_normal_hints(conn, id),
- &win->sh, NULL);
+ xcb_icccm_get_wm_normal_hints(conn, id),
+ &win->sh, NULL);
xcb_icccm_get_wm_hints_reply(conn,
- xcb_icccm_get_wm_hints(conn, id),
- &win->hints, NULL);
+ xcb_icccm_get_wm_hints(conn, id),
+ &win->hints, NULL);
xcb_icccm_get_wm_transient_for_reply(conn,
- xcb_icccm_get_wm_transient_for(conn, id),
- &trans, NULL);
+ xcb_icccm_get_wm_transient_for(conn, id),
+ &trans, NULL);
if (trans) {
win->transient = trans;
set_child_transient(win, &trans);
/* get supported protocols */
if (xcb_icccm_get_wm_protocols_reply(conn,
- xcb_icccm_get_wm_protocols(conn, id, prot),
- &wpr, NULL)) {
+ xcb_icccm_get_wm_protocols(conn, id, prot),
+ &wpr, NULL)) {
for (i = 0; i < wpr.atoms_len; i++) {
if (wpr.atoms[i] == takefocus)
win->take_focus = 1;
DNPRINTF(SWM_D_PROP, "manage_window: set _SWM_WS: %s\n",
ws_idx_str);
xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->id,
- ws_idx_atom, XCB_ATOM_STRING, 8, strlen(ws_idx_str),
- ws_idx_str);
+ ws_idx_atom, XCB_ATOM_STRING, 8, strlen(ws_idx_str),
+ ws_idx_str);
}
if (prop)
free(prop);
ewmh_autoquirk(win);
if (xcb_icccm_get_wm_class_reply(conn,
- xcb_icccm_get_wm_class(conn, win->id),
- &win->ch, NULL)) {
+ xcb_icccm_get_wm_class(conn, win->id),
+ &win->ch, NULL)) {
DNPRINTF(SWM_D_CLASS, "manage_window: class: %s, name: %s\n",
win->ch.class_name, win->ch.instance_name);
}
event_mask = XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_FOCUS_CHANGE |
- XCB_EVENT_MASK_PROPERTY_CHANGE |
- XCB_EVENT_MASK_STRUCTURE_NOTIFY;
+ XCB_EVENT_MASK_PROPERTY_CHANGE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
xcb_change_window_attributes(conn, id, XCB_CW_EVENT_MASK, &event_mask);
if (win == NULL)
return;
- /* needed for restart wm */
- set_win_state(win, XCB_ICCCM_WM_STATE_WITHDRAWN);
-
TAILQ_REMOVE(&win->ws->unmanagedlist, win, entry);
if (win->wa)
free(win->wa);
-
+
xcb_icccm_get_wm_class_reply_wipe(&win->ch);
kill_refs(win);
memset(win, 0xff, sizeof *win); /* XXX kill later */
free(win);
+ DNPRINTF(SWM_D_MISC, "free_window: done\n");
}
void
/* focus on root just in case */
screen = xcb_setup_roots_iterator(xcb_get_setup(conn)).data;
xcb_set_input_focus(conn, XCB_INPUT_FOCUS_POINTER_ROOT,
- screen->root, XCB_CURRENT_TIME);
+ screen->root, XCB_CURRENT_TIME);
focus_prev(win);
}
void
-expose(XEvent *e)
+expose(xcb_expose_event_t *e)
{
- DNPRINTF(SWM_D_EVENT, "expose: window: 0x%lx\n", e->xexpose.window);
+ 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
-keypress(XEvent *e)
+keypress(xcb_key_press_event_t *e)
{
KeySym keysym;
- XKeyEvent *ev = &e->xkey;
struct key *kp;
struct swm_region *r;
- keysym = XkbKeycodeToKeysym(display, (KeyCode)ev->keycode, 0, 0);
- if ((kp = key_lookup(CLEANMASK(ev->state), keysym)) == NULL)
+ keysym = XkbKeycodeToKeysym(display, (KeyCode)e->detail, 0, 0);
+
+ DNPRINTF(SWM_D_EVENT, "keypress: %u\n", e->detail);
+
+ if ((kp = key_lookup(CLEANMASK(e->state), keysym)) == NULL)
return;
if (keyfuncs[kp->funcid].func == NULL)
return;
- r = root_to_region(ev->root);
+ r = root_to_region(e->root);
if (kp->funcid == kf_spawn_custom)
spawn_custom(r, &(keyfuncs[kp->funcid].args), kp->spawn_name);
else
}
void
-buttonpress(XEvent *e)
+buttonpress(xcb_button_press_event_t *e)
{
struct ws_win *win;
int i, action;
- XButtonPressedEvent *ev = &e->xbutton;
- if ((win = find_window(ev->window)) == NULL)
+ DNPRINTF(SWM_D_EVENT, "buttonpress: window 0x%x\n", e->event);
+
+ if ((win = find_window(e->event)) == NULL)
return;
focus_magic(win);
for (i = 0; i < LENGTH(buttons); i++)
if (action == buttons[i].action && buttons[i].func &&
- buttons[i].button == ev->button &&
- CLEANMASK(buttons[i].mask) == CLEANMASK(ev->state))
+ buttons[i].button == e->detail &&
+ CLEANMASK(buttons[i].mask) == CLEANMASK(e->state))
buttons[i].func(win, &buttons[i].args);
}
void
-configurerequest(XEvent *e)
+configurerequest(xcb_configure_request_event_t *e)
{
- XConfigureRequestEvent *ev = &e->xconfigurerequest;
struct ws_win *win;
int new = 0, i = 0;
- uint16_t mask = 0;
- uint32_t wc[7];
+ uint16_t mask = 0;
+ uint32_t wc[7] = {0};
- if ((win = find_window(ev->window)) == NULL)
- if ((win = find_unmanaged_window(ev->window)) == NULL)
+ if ((win = find_window(e->window)) == NULL)
+ if ((win = find_unmanaged_window(e->window)) == NULL)
new = 1;
if (new) {
- if (ev->value_mask & XCB_CONFIG_WINDOW_X) {
+ if (e->value_mask & XCB_CONFIG_WINDOW_X) {
mask |= XCB_CONFIG_WINDOW_X;
- wc[i++] = ev->x;
+ wc[i++] = e->x;
}
- if (ev->value_mask & XCB_CONFIG_WINDOW_Y) {
+ if (e->value_mask & XCB_CONFIG_WINDOW_Y) {
mask |= XCB_CONFIG_WINDOW_Y;
- wc[i++] = ev->y;
+ wc[i++] = e->y;
}
- if (ev->value_mask & XCB_CONFIG_WINDOW_WIDTH) {
+ if (e->value_mask & XCB_CONFIG_WINDOW_WIDTH) {
mask |= XCB_CONFIG_WINDOW_WIDTH;
- wc[i++] = ev->width;
+ wc[i++] = e->width;
}
- if (ev->value_mask & XCB_CONFIG_WINDOW_HEIGHT) {
+ if (e->value_mask & XCB_CONFIG_WINDOW_HEIGHT) {
mask |= XCB_CONFIG_WINDOW_HEIGHT;
- wc[i++] = ev->height;
+ wc[i++] = e->height;
}
- if (ev->value_mask & XCB_CONFIG_WINDOW_BORDER_WIDTH) {
+ if (e->value_mask & XCB_CONFIG_WINDOW_BORDER_WIDTH) {
mask |= XCB_CONFIG_WINDOW_BORDER_WIDTH;
- wc[i++] = ev->border_width;
+ wc[i++] = e->border_width;
}
- if (ev->value_mask & XCB_CONFIG_WINDOW_SIBLING) {
+ if (e->value_mask & XCB_CONFIG_WINDOW_SIBLING) {
mask |= XCB_CONFIG_WINDOW_SIBLING;
- wc[i++] = ev->above;
+ wc[i++] = e->sibling;
}
- if (ev->value_mask & XCB_CONFIG_WINDOW_STACK_MODE) {
+ if (e->value_mask & XCB_CONFIG_WINDOW_STACK_MODE) {
mask |= XCB_CONFIG_WINDOW_STACK_MODE;
- wc[i++] = ev->detail;
+ wc[i++] = e->stack_mode;
}
- DNPRINTF(SWM_D_EVENT, "configurerequest: new window: 0x%lx, "
- "new: %s, (x,y) w x h: (%d,%d) %d x %d\n", ev->window,
+ DNPRINTF(SWM_D_EVENT, "configurerequest: new window: 0x%x, "
+ "new: %s, (x,y) w x h: (%d,%d) %d x %d\n", e->window,
YESNO(new), wc[0], wc[1], wc[2], wc[3]);
- xcb_configure_window(conn, ev->window, mask, wc);
+ xcb_configure_window(conn, e->window, mask, wc);
} else if ((!win->manual || win->quirks & SWM_Q_ANYWHERE) &&
!(win->ewmh_flags & EWMH_F_FULLSCREEN)) {
- win->g_float.x = ev->x - X(win->ws->r);
- win->g_float.y = ev->y - Y(win->ws->r);
- win->g_float.w = ev->width;
- win->g_float.h = ev->height;
+ win->g_float.x = e->x - X(win->ws->r);
+ win->g_float.y = e->y - Y(win->ws->r);
+ win->g_float.w = e->width;
+ win->g_float.h = e->height;
win->g_floatvalid = 1;
if (win->floating) {
win->g.y += Y(win->ws->r);
update_window(win);
} else {
- config_win(win, ev);
+ config_win(win, e);
}
} else {
- config_win(win, ev);
+ config_win(win, e);
}
}
void
-configurenotify(XEvent *e)
+configurenotify(xcb_configure_notify_event_t *e)
{
struct ws_win *win;
- DNPRINTF(SWM_D_EVENT, "configurenotify: window: 0x%lx\n",
- e->xconfigure.window);
+ DNPRINTF(SWM_D_EVENT, "configurenotify: window: 0x%x\n",
+ e->window);
- win = find_window(e->xconfigure.window);
+ win = find_window(e->window);
if (win) {
xcb_icccm_get_wm_normal_hints_reply(conn,
- xcb_icccm_get_wm_normal_hints(conn, win->id),
- &win->sh, NULL);
+ xcb_icccm_get_wm_normal_hints(conn, win->id),
+ &win->sh, NULL);
adjust_font(win);
if (font_adjusted)
stack();
- if (focus_mode == SWM_FOCUS_DEFAULT)
- drain_enter_notify();
}
}
void
-destroynotify(XEvent *e)
+destroynotify(xcb_destroy_notify_event_t *e)
{
struct ws_win *win;
- XDestroyWindowEvent *ev = &e->xdestroywindow;
- DNPRINTF(SWM_D_EVENT, "destroynotify: window: 0x%lx\n", ev->window);
+ DNPRINTF(SWM_D_EVENT, "destroynotify: window: 0x%x\n", e->window);
- if ((win = find_window(ev->window)) == NULL) {
- if ((win = find_unmanaged_window(ev->window)) == NULL)
+ if ((win = find_window(e->window)) == NULL) {
+ if ((win = find_unmanaged_window(e->window)) == NULL)
return;
free_window(win);
return;
unmanage_window(win);
stack();
- if (focus_mode == SWM_FOCUS_DEFAULT)
- drain_enter_notify();
free_window(win);
}
void
-enternotify(XEvent *e)
+enternotify(xcb_enter_notify_event_t *e)
{
- XCrossingEvent *ev = &e->xcrossing;
- XEvent cne;
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%lx, mode: %d, detail: "
- "%d, root: 0x%lx, subwindow: 0x%lx, same_screen: %s, focus: %s, "
- "state: %d\n", ev->window, ev->mode, ev->detail, ev->root,
- ev->subwindow, YESNO(ev->same_screen), YESNO(ev->focus), ev->state);
+ 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,
+ e->child, YESNO(e->same_screen_focus), e->state);
- if (ev->mode != NotifyNormal) {
+ if (e->mode != XCB_NOTIFY_MODE_NORMAL) {
DNPRINTF(SWM_D_EVENT, "skip enternotify: generated by "
"cursor grab.\n");
return;
break;
}
- if ((win = find_window(ev->window)) == NULL) {
+ if ((win = find_window(e->event)) == NULL) {
DNPRINTF(SWM_D_EVENT, "skip enternotify: window is NULL\n");
return;
}
- /*
- * if we have more enternotifies let them handle it in due time
- */
- if (XCheckTypedEvent(display, EnterNotify, &cne) == True) {
- DNPRINTF(SWM_D_EVENT,
- "ignoring enternotify: got more enternotify\n");
- XPutBackEvent(display, &cne);
- return;
- }
-
focus_magic(win);
}
#define MERGE_MEMBERS(a,b) (((a & 0xffff) << 16) | (b & 0xffff))
void
-focusevent(XEvent *e)
+mapnotify(xcb_map_notify_event_t *e)
{
-#if 0
struct ws_win *win;
- u_int32_t mode_detail;
- XFocusChangeEvent *ev = &e->xfocus;
- DNPRINTF(SWM_D_EVENT, "focusevent: %s window: 0x%lx mode: %d "
- "detail: %d\n", ev->type == FocusIn ? "entering" : "leaving",
- ev->window, ev->mode, ev->detail);
-
- if (last_focus_event == ev->type) {
- DNPRINTF(SWM_D_FOCUS, "ignoring focusevent: bad ordering\n");
- return;
- }
+ DNPRINTF(SWM_D_EVENT, "mapnotify: window: 0x%x\n", e->window);
- last_focus_event = ev->type;
- mode_detail = MERGE_MEMBERS(ev->mode, ev->detail);
-
- switch (mode_detail) {
- /* synergy client focus operations */
- case MERGE_MEMBERS(NotifyNormal, NotifyNonlinear):
- case MERGE_MEMBERS(NotifyNormal, NotifyNonlinearVirtual):
-
- /* synergy server focus operations */
- case MERGE_MEMBERS(NotifyWhileGrabbed, NotifyNonlinear):
-
- /* Entering applications like rdesktop that mangle the pointer */
- case MERGE_MEMBERS(NotifyNormal, NotifyPointer):
-
- if ((win = find_window(e->xfocus.window)) != NULL && win->ws->r)
- XSetWindowBorder(display, win->id,
- win->ws->r->s->c[ev->type == FocusIn ?
- SWM_S_COLOR_FOCUS : SWM_S_COLOR_UNFOCUS].color);
- break;
- default:
- warnx("ignoring focusevent");
- DNPRINTF(SWM_D_FOCUS, "ignoring focusevent\n");
- break;
- }
-#endif
-}
-
-void
-mapnotify(XEvent *e)
-{
- struct ws_win *win;
- XMapEvent *ev = &e->xmap;
-
- DNPRINTF(SWM_D_EVENT, "mapnotify: window: 0x%lx\n", ev->window);
-
- win = manage_window(ev->window);
+ win = manage_window(e->window);
if (win)
set_win_state(win, XCB_ICCCM_WM_STATE_NORMAL);
}
void
-mappingnotify(XEvent *e)
+mappingnotify(xcb_mapping_notify_event_t *e)
{
- XMappingEvent *ev = &e->xmapping;
+ xcb_refresh_keyboard_mapping(syms, e);
- XRefreshKeyboardMapping(ev);
- if (ev->request == MappingKeyboard)
+ if (e->request == XCB_MAPPING_KEYBOARD)
grabkeys();
}
void
-maprequest(XEvent *e)
+maprequest(xcb_map_request_event_t *e)
{
struct ws_win *win;
struct swm_region *r;
- XMapRequestEvent *ev = &e->xmaprequest;
xcb_get_window_attributes_reply_t *war;
- DNPRINTF(SWM_D_EVENT, "maprequest: window: 0x%lx\n",
- e->xmaprequest.window);
+ DNPRINTF(SWM_D_EVENT, "maprequest: window: 0x%x\n",
+ e->window);
war = xcb_get_window_attributes_reply(conn,
- xcb_get_window_attributes(conn, ev->window),
- NULL);
+ xcb_get_window_attributes(conn, e->window),
+ NULL);
if (!war)
return;
if (war->override_redirect) {
free(war);
return;
- }
+ }
free(war);
- win = manage_window(e->xmaprequest.window);
+ win = manage_window(e->window);
if (win == NULL) {
return; /* can't happen */
}
}
void
-propertynotify(XEvent *e)
+propertynotify(xcb_property_notify_event_t *e)
{
struct ws_win *win;
- XPropertyEvent *ev = &e->xproperty;
#ifdef SWM_DEBUG
char *name;
size_t len;
xcb_get_atom_name_reply_t *r;
r = xcb_get_atom_name_reply(conn,
- xcb_get_atom_name(conn, ev->atom),
- NULL);
+ xcb_get_atom_name(conn, e->atom),
+ NULL);
if (r) {
len = xcb_get_atom_name_name_length(r);
if (len > 0) {
if (name) {
memcpy(name, xcb_get_atom_name_name(r), len);
name[len] = '\0';
-
+
DNPRINTF(SWM_D_EVENT,
- "propertynotify: window: 0x%lx, "
- "atom: %s\n",
- ev->window, name);
+ "propertynotify: window: 0x%x, atom: %s\n",
+ e->window, name);
free(name);
}
}
}
#endif
- win = find_window(ev->window);
+ win = find_window(e->window);
if (win == NULL)
return;
- if (ev->state == PropertyDelete && ev->atom == a_swm_iconic) {
+ if (e->state == XCB_PROPERTY_DELETE && e->atom == a_swm_iconic) {
update_iconic(win, 0);
map_window_raised(win->id);
stack();
return;
}
- switch (ev->atom) {
+ switch (e->atom) {
#if 0
- case XA_WM_NORMAL_HINTS:
- long mask;
- XGetWMNormalHints(display, win->id, &win->sh, &mask);
+ 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;
}
void
-unmapnotify(XEvent *e)
+unmapnotify(xcb_unmap_notify_event_t *e)
{
struct ws_win *win;
- DNPRINTF(SWM_D_EVENT, "unmapnotify: window: 0x%lx\n", e->xunmap.window);
+ DNPRINTF(SWM_D_EVENT, "unmapnotify: window: 0x%x\n", e->window);
/* determine if we need to help unmanage this window */
- win = find_window(e->xunmap.window);
+ win = find_window(e->window);
if (win == NULL)
return;
- if (getstate(e->xunmap.window) == XCB_ICCCM_WM_STATE_NORMAL) {
+ if (getstate(e->window) == XCB_ICCCM_WM_STATE_NORMAL) {
unmanage_window(win);
stack();
- /* giant hack for apps that don't destroy transient windows */
- /* eat a bunch of events to prevent remanaging the window */
- XEvent cne;
- while (XCheckWindowEvent(display, e->xunmap.window,
- EnterWindowMask, &cne))
- ;
- while (XCheckWindowEvent(display, e->xunmap.window,
- StructureNotifyMask, &cne))
- ;
- while (XCheckWindowEvent(display, e->xunmap.window,
- SubstructureNotifyMask, &cne))
- ;
/* resend unmap because we ated it */
- xcb_unmap_window(conn, e->xunmap.window);
+ xcb_unmap_window(conn, e->window);
}
-
- if (focus_mode == SWM_FOCUS_DEFAULT)
- drain_enter_notify();
}
void
-visibilitynotify(XEvent *e)
+visibilitynotify(xcb_visibility_notify_event_t *e)
{
int i, num_screens;
struct swm_region *r;
- DNPRINTF(SWM_D_EVENT, "visibilitynotify: window: 0x%lx\n",
- e->xvisibility.window);
+ DNPRINTF(SWM_D_EVENT, "visibilitynotify: window: 0x%x\n",
+ e->window);
- if (e->xvisibility.state == VisibilityUnobscured) {
+ 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->xvisibility.window == WINID(r->bar))
+ if (e->window == WINID(r->bar))
bar_update();
}
}
void
-clientmessage(XEvent *e)
+clientmessage(xcb_client_message_event_t *e)
{
- XClientMessageEvent *ev;
- struct ws_win *win;
-
- ev = &e->xclient;
+ struct ws_win *win;
- win = find_window(ev->window);
- if (win == NULL) {
- if (ev->message_type == ewmh[_NET_ACTIVE_WINDOW].atom) {
- DNPRINTF(SWM_D_EVENT, "clientmessage: request focus on "
- "unmanaged window.\n");
- e->xmaprequest.window = ev->window;
- maprequest(e);
- }
+ win = find_window(e->window);
+ if (win == NULL)
return;
}
- DNPRINTF(SWM_D_EVENT, "clientmessage: window: 0x%lx, type: %ld\n",
- ev->window, ev->message_type);
+ DNPRINTF(SWM_D_EVENT, "clientmessage: window: 0x%x, type: %u\n",
+ e->window, e->response_type);
- if (ev->message_type == ewmh[_NET_ACTIVE_WINDOW].atom) {
+ if (e->response_type == ewmh[_NET_ACTIVE_WINDOW].atom) {
DNPRINTF(SWM_D_EVENT, "clientmessage: _NET_ACTIVE_WINDOW\n");
focus_win(win);
}
- if (ev->message_type == ewmh[_NET_CLOSE_WINDOW].atom) {
+ if (e->response_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 (ev->message_type == ewmh[_NET_MOVERESIZE_WINDOW].atom) {
+ if (e->response_type == ewmh[_NET_MOVERESIZE_WINDOW].atom) {
DNPRINTF(SWM_D_EVENT,
"clientmessage: _NET_MOVERESIZE_WINDOW\n");
if (win->floating) {
- if (ev->data.l[0] & (1<<8)) /* x */
- X(win) = ev->data.l[1];
- if (ev->data.l[0] & (1<<9)) /* y */
- Y(win) = ev->data.l[2];
- if (ev->data.l[0] & (1<<10)) /* width */
- WIDTH(win) = ev->data.l[3];
- if (ev->data.l[0] & (1<<11)) /* height */
- HEIGHT(win) = ev->data.l[4];
+ if (e->data.data32[0] & (1<<8)) /* x */
+ X(win) = e->data.data32[1];
+ if (e->data.data32[0] & (1<<9)) /* y */
+ Y(win) = e->data.data32[2];
+ if (e->data.data32[0] & (1<<10)) /* width */
+ WIDTH(win) = e->data.data32[3];
+ if (e->data.data32[0] & (1<<11)) /* height */
+ HEIGHT(win) = e->data.data32[4];
update_window(win);
}
config_win(win, NULL);
}
}
- if (ev->message_type == ewmh[_NET_WM_STATE].atom) {
+ if (e->response_type == ewmh[_NET_WM_STATE].atom) {
DNPRINTF(SWM_D_EVENT, "clientmessage: _NET_WM_STATE\n");
- ewmh_update_win_state(win, ev->data.l[1], ev->data.l[0]);
- if (ev->data.l[2])
- ewmh_update_win_state(win, ev->data.l[2],
- ev->data.l[0]);
+ ewmh_update_win_state(win, e->data.data32[1], e->data.data32[0]);
+ if (e->data.data32[2])
+ ewmh_update_win_state(win, e->data.data32[2],
+ e->data.data32[0]);
stack();
}
#ifdef SWM_XRR_HAS_CRTC
if (xrandr_support) {
src = xcb_randr_get_screen_resources_current(conn,
- screens[i].root);
+ screens[i].root);
srr = xcb_randr_get_screen_resources_current_reply(conn, src,
- NULL);
+ NULL);
if (srr == NULL) {
new_region(&screens[i], 0, 0,
screen->width_in_pixels,
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);
+ XCB_CURRENT_TIME);
cir = xcb_randr_get_crtc_info_reply(conn, cic, NULL);
if (cir == NULL)
continue;
}
void
-screenchange(XEvent *e)
+screenchange(xcb_randr_screen_change_notify_event_t *e)
{
- XRRScreenChangeNotifyEvent *xe = (XRRScreenChangeNotifyEvent *)e;
struct swm_region *r;
int i, num_screens;
- DNPRINTF(SWM_D_EVENT, "screenchange: root: 0x%lx\n", xe->root);
+ DNPRINTF(SWM_D_EVENT, "screenchange: root: 0x%x\n", e->root);
- if (!XRRUpdateConfiguration(e))
- return;
+ if (e->rotation & (XCB_RANDR_ROTATION_ROTATE_90
+ | XCB_RANDR_ROTATION_ROTATE_270))
+ xcb_randr_set_screen_size(conn, e->root, e->height,
+ e->width, e->mheight, e->mwidth);
+ else
+ xcb_randr_set_screen_size(conn, e->root, e->width,
+ e->height, e->mwidth, e->mheight);
num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
/* silly event doesn't include the screen index */
for (i = 0; i < num_screens; i++)
- if (screens[i].root == xe->root)
+ if (screens[i].root == e->root)
break;
if (i >= num_screens)
errx(1, "screenchange: screen not found");
TAILQ_FOREACH(r, &screens[i].rl, entry)
bar_setup(r);
stack();
- if (focus_mode == SWM_FOCUS_DEFAULT)
- drain_enter_notify();
}
void
}
pc = xcb_icccm_get_wm_transient_for(conn, wins[j]);
- if (xcb_icccm_get_wm_transient_for_reply(conn, pc, &wins[j],
- NULL)) {
+ if (xcb_icccm_get_wm_transient_for_reply(conn, pc,
+ &wins[j], NULL)) {
free(r);
continue;
}
state = getstate(wins[j]);
manage = state == XCB_ICCCM_WM_STATE_ICONIC;
pc = xcb_icccm_get_wm_transient_for(conn, wins[j]);
- if (xcb_icccm_get_wm_transient_for_reply(conn, pc, &wins[j],
- NULL) && manage)
+ if (xcb_icccm_get_wm_transient_for_reply(conn, pc,
+ &wins[j], NULL) && manage)
manage_window(wins[j]);
}
free(qtr);
screens[i].bar_gc = xcb_generate_id(conn);
gcv[0] = 0;
xcb_create_gc(conn, screens[i].bar_gc, screens[i].root,
- XCB_GC_GRAPHICS_EXPOSURES, gcv);
+ XCB_GC_GRAPHICS_EXPOSURES, gcv);
/* set default cursor */
xcb_change_window_attributes(conn, screens[i].root,
- XCB_CW_CURSOR, wa);
+ XCB_CW_CURSOR, wa);
/* init all workspaces */
/* XXX these should be dynamically allocated too */
if (xrandr_support)
xcb_randr_select_input(conn, screens[i].root,
- XCB_RANDR_NOTIFY_MASK_SCREEN_CHANGE);
+ XCB_RANDR_NOTIFY_MASK_SCREEN_CHANGE);
}
xcb_free_cursor(conn, cursor);
xcb_close_font(conn, cursor_font);
int i, num_screens;
xcb_atom_t netwmcheck, netwmname, utf8_string;
xcb_window_t root, win;
- xcb_screen_t *screen;
uint32_t wa[2];
/* work around sun jdk bugs, code from wmname */
num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
for (i = 0; i < num_screens; i++) {
root = screens[i].root;
- screen = get_screen(i);
win = xcb_generate_id(conn);
wa[0] = screens[i].c[SWM_S_COLOR_UNFOCUS].color;
wa[1] = screens[i].c[SWM_S_COLOR_UNFOCUS].color;
- xcb_create_window(conn, screen->root_depth, win, 0,
- 0, 0, 1, 1, 0, XCB_WINDOW_CLASS_INPUT_OUTPUT,
- screen->root_visual,
- XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL, wa);
+ xcb_create_window(conn, XCB_COPY_FROM_PARENT, win, 0, 0, 0, 1,
+ 1, 0, XCB_WINDOW_CLASS_INPUT_OUTPUT, XCB_COPY_FROM_PARENT,
+ XCB_CW_BACK_PIXEL | XCB_CW_BORDER_PIXEL, wa);
xcb_change_property(conn, XCB_PROP_MODE_REPLACE, root,
- netwmcheck, XCB_ATOM_WINDOW, 32, 1, &win);
+ netwmcheck, XCB_ATOM_WINDOW, 32, 1, &win);
xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win,
- netwmcheck, XCB_ATOM_WINDOW, 32, 1, &win);
+ netwmcheck, XCB_ATOM_WINDOW, 32, 1, &win);
xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win,
- netwmname, utf8_string, 8, strlen("LG3D"), "LG3D");
- }
+ netwmname, utf8_string, 8, strlen("LG3D"), "LG3D");
+ }
+}
+
+void
+event_error(xcb_generic_error_t *e)
+{
+ DNPRINTF(SWM_D_EVENT, "event_error: %s(%u) from %s(%u), sequence: %u, "
+ "resource_id: %u, minor_code: %u\n",
+ xcb_event_get_error_label(e->error_code), e->error_code,
+ xcb_event_get_request_label(e->major_code), e->major_code,
+ e->sequence, e->resource_id, e->minor_code);
+}
+
+void
+event_handle(xcb_generic_event_t *evt)
+{
+ uint8_t type = XCB_EVENT_RESPONSE_TYPE(evt);
+ switch (type) {
+#define EVENT(type, callback) case type: callback((void *)evt); return
+ EVENT(0, event_error);
+ EVENT(XCB_BUTTON_PRESS, buttonpress);
+ /*EVENT(XCB_BUTTON_RELEASE, buttonpress);*/
+ /*EVENT(XCB_CIRCULATE_NOTIFY, );*/
+ /*EVENT(XCB_CIRCULATE_REQUEST, );*/
+ EVENT(XCB_CLIENT_MESSAGE, clientmessage);
+ /*EVENT(XCB_COLORMAP_NOTIFY, );*/
+ EVENT(XCB_CONFIGURE_NOTIFY, configurenotify);
+ EVENT(XCB_CONFIGURE_REQUEST, configurerequest);
+ /*EVENT(XCB_CREATE_NOTIFY, );*/
+ EVENT(XCB_DESTROY_NOTIFY, destroynotify);
+ EVENT(XCB_ENTER_NOTIFY, enternotify);
+ EVENT(XCB_EXPOSE, expose);
+ /*EVENT(XCB_FOCUS_IN, );*/
+ /*EVENT(XCB_FOCUS_OUT, );*/
+ /*EVENT(XCB_GRAPHICS_EXPOSURE, );*/
+ /*EVENT(XCB_GRAVITY_NOTIFY, );*/
+ EVENT(XCB_KEY_PRESS, keypress);
+ /*EVENT(XCB_KEY_RELEASE, keypress);*/
+ /*EVENT(XCB_KEYMAP_NOTIFY, );*/
+ /*EVENT(XCB_LEAVE_NOTIFY, );*/
+ EVENT(XCB_MAP_NOTIFY, mapnotify);
+ EVENT(XCB_MAP_REQUEST, maprequest);
+ EVENT(XCB_MAPPING_NOTIFY, mappingnotify);
+ /*EVENT(XCB_MOTION_NOTIFY, );*/
+ /*EVENT(XCB_NO_EXPOSURE, );*/
+ EVENT(XCB_PROPERTY_NOTIFY, propertynotify);
+ /*EVENT(XCB_REPARENT_NOTIFY, );*/
+ /*EVENT(XCB_RESIZE_REQUEST, );*/
+ /*EVENT(XCB_SELECTION_CLEAR, );*/
+ /*EVENT(XCB_SELECTION_NOTIFY, );*/
+ /*EVENT(XCB_SELECTION_REQUEST, );*/
+ EVENT(XCB_UNMAP_NOTIFY, unmapnotify);
+ EVENT(XCB_VISIBILITY_NOTIFY, visibilitynotify);
+#undef EVENT
+ }
+ if (type - xrandr_eventbase == XCB_RANDR_SCREEN_CHANGE_NOTIFY)
+ screenchange((void *)evt);
}
int
{
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;
- XEvent e;
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);
if (!(display = XOpenDisplay(0)))
errx(1, "can not open display");
- if (!(conn = XGetXCBConnection(display)))
- errx(1, "can not get XCB connection");
-
- if (active_wm())
- errx(1, "other wm running");
-
/* handle some signals */
bzero(&sact, sizeof(sact));
sigemptyset(&sact.sa_mask);
sact.sa_flags = SA_NOCLDSTOP;
sigaction(SIGCHLD, &sact, NULL);
+ conn = XGetXCBConnection(display);
+ if (xcb_connection_has_error(conn))
+ errx(1, "can not get XCB connection");
+
+ 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");
if (pwd == NULL)
errx(1, "invalid user: %d", getuid());
- syms = xcb_key_symbols_alloc(conn);
- if (syms == NULL)
- errx(1, "unable to allocate key symbols");
+ xcb_grab_server(conn);
+ xcb_aux_sync(conn);
+
+ /* flush all events */
+ while ((evt = xcb_poll_for_event(conn))) {
+ uint8_t type = XCB_EVENT_RESPONSE_TYPE(evt);
+ if (type == 0)
+ event_handle(evt);
+ free(evt);
+ }
+
+ if (active_wm())
+ errx(1, "other wm running");
+
+ xcb_aux_sync(conn);
setup_globals();
setup_screens();
bar_setup(r);
}
- unfocus_all();
+ //unfocus_all();
grabkeys();
stack();
- if (focus_mode == SWM_FOCUS_DEFAULT)
- drain_enter_notify();
- xfd = xcb_get_file_descriptor(conn);
+ xcb_ungrab_server(conn);
+ xcb_flush(conn);
+
while (running) {
- while (XPending(display)) {
- XNextEvent(display, &e);
+ 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;
- if (e.type < LASTEvent) {
- DNPRINTF(SWM_D_EVENTQ ,"XEvent: handled: %s, "
- "window: 0x%lx, type: %s (%d), %d remaining"
- "\n", YESNO(handler[e.type]),
- e.xany.window, geteventname(&e),
- e.type, QLength(display));
-
- if (handler[e.type])
- handler[e.type](&e);
- } else {
- DNPRINTF(SWM_D_EVENTQ, "XRandr Event: window: "
- "0x%lx, type: %s (%d)\n", e.xany.window,
- xrandr_geteventname(&e), e.type);
-
- switch (e.type - xrandr_eventbase) {
- case XCB_RANDR_SCREEN_CHANGE_NOTIFY:
- screenchange(&e);
- break;
- default:
- break;
- }
- }
+ event_handle(evt);
+ free(evt);
}
/* if we are being restarted go focus on first window */
/* move pointer to first screen if multi screen */
if (num_screens > 1 || outputs > 1)
xcb_warp_pointer(conn, XCB_WINDOW_NONE,
- rr->s[0].root, 0, 0, 0, 0, X(rr),
- Y(rr) + (bar_enabled ? bar_height : 0));
+ rr->s[0].root, 0, 0, 0, 0, X(rr),
+ Y(rr) + (bar_enabled ? bar_height : 0));
a.id = SWM_ARG_ID_FOCUSCUR;
focus(rr, &a);
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)
if (screens[i].bar_gc != 0)
xcb_free_gc(conn, screens[i].bar_gc);
XFreeFontSet(display, bar_fs);
-
+
xcb_key_symbols_free(syms);
xcb_disconnect(conn);