#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 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 *);
-void event_handle(xcb_generic_event_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)
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)
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(xcb_generic_event_t *e)
-{
- char *name = NULL;
-
- switch (XCB_EVENT_RESPONSE_TYPE(e)) {
- case XCB_KEY_PRESS:
- name = "KeyPress";
- break;
- case XCB_KEY_RELEASE:
- name = "KeyRelease";
- break;
- case XCB_BUTTON_PRESS:
- name = "ButtonPress";
- break;
- case XCB_BUTTON_RELEASE:
- name = "ButtonRelease";
- break;
- case XCB_MOTION_NOTIFY:
- name = "MotionNotify";
- break;
- case XCB_ENTER_NOTIFY:
- name = "EnterNotify";
- break;
- case XCB_LEAVE_NOTIFY:
- name = "LeaveNotify";
- break;
- case XCB_FOCUS_IN:
- name = "FocusIn";
- break;
- case XCB_FOCUS_OUT:
- name = "FocusOut";
- break;
- case XCB_KEYMAP_NOTIFY:
- name = "KeymapNotify";
- break;
- case XCB_EXPOSE:
- name = "Expose";
- break;
- case XCB_GRAPHICS_EXPOSURE:
- name = "GraphicsExposure";
- break;
- case XCB_NO_EXPOSURE:
- name = "NoExposure";
- break;
- case XCB_VISIBILITY_NOTIFY:
- name = "VisibilityNotify";
- break;
- case XCB_CREATE_NOTIFY:
- name = "CreateNotify";
- break;
- case XCB_DESTROY_NOTIFY:
- name = "DestroyNotify";
- break;
- case XCB_UNMAP_NOTIFY:
- name = "UnmapNotify";
- break;
- case XCB_MAP_NOTIFY:
- name = "MapNotify";
- break;
- case XCB_MAP_REQUEST:
- name = "MapRequest";
- break;
- case XCB_REPARENT_NOTIFY:
- name = "ReparentNotify";
- break;
- case XCB_CONFIGURE_NOTIFY:
- name = "ConfigureNotify";
- break;
- case XCB_CONFIGURE_REQUEST:
- name = "ConfigureRequest";
- break;
- case XCB_GRAVITY_NOTIFY:
- name = "GravityNotify";
- break;
- case XCB_RESIZE_REQUEST:
- name = "ResizeRequest";
- break;
- case XCB_CIRCULATE_NOTIFY:
- name = "CirculateNotify";
- break;
- case XCB_CIRCULATE_REQUEST:
- name = "CirculateRequest";
- break;
- case XCB_PROPERTY_NOTIFY:
- name = "PropertyNotify";
- break;
- case XCB_SELECTION_CLEAR:
- name = "SelectionClear";
- break;
- case XCB_SELECTION_REQUEST:
- name = "SelectionRequest";
- break;
- case XCB_SELECTION_NOTIFY:
- name = "SelectionNotify";
- break;
- case XCB_COLORMAP_NOTIFY:
- name = "ColormapNotify";
- break;
- case XCB_CLIENT_MESSAGE:
- name = "ClientMessage";
- break;
- case XCB_MAPPING_NOTIFY:
- name = "MappingNotify";
- 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 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 *);
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;
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);
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,
- 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);
return;
xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->id, astate,
- astate, 32, 2, data);
+ astate, 32, 2, data);
}
uint16_t
}
DNPRINTF(SWM_D_MISC, "getstate property: win 0x%x state %u\n", w,
-result);
+ 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 */
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",
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
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) {
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();
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);
}
}
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
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;
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;
/* get cursor offset from window root */
xpr = xcb_query_pointer_reply(conn, xcb_query_pointer(conn, win->id),
- NULL);
+ NULL);
if (!xpr)
return;
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;
}
+ xcb_flush(conn);
buttonrelease = 0;
while ((evt = xcb_poll_for_event(conn)) && buttonrelease != 1) {
/*
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);
}
void
move(struct ws_win *win, union arg *args)
{
- xcb_timestamp_t time = 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_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);
return;
}
+ xcb_flush(conn);
buttonrelease = 0;
while ((evt = xcb_poll_for_event(conn)) && buttonrelease != 1) {
/*
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);
}
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);
}
}
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)
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(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 swm_region *r;
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)
struct ws_win *win;
int new = 0, i = 0;
uint16_t mask = 0;
- uint32_t wc[7];
+ uint32_t wc[7] = {0};
if ((win = find_window(e->window)) == NULL)
if ((win = find_unmanaged_window(e->window)) == NULL)
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();
e->window);
war = xcb_get_window_attributes_reply(conn,
- xcb_get_window_attributes(conn, e->window),
- NULL);
+ xcb_get_window_attributes(conn, e->window),
+ NULL);
if (!war)
return;
if (war->override_redirect) {
xcb_get_atom_name_reply_t *r;
r = xcb_get_atom_name_reply(conn,
- xcb_get_atom_name(conn, e->atom),
- NULL);
+ xcb_get_atom_name(conn, e->atom),
+ NULL);
if (r) {
len = xcb_get_atom_name_name_length(r);
if (len > 0) {
name[len] = '\0';
DNPRINTF(SWM_D_EVENT,
- "propertynotify: window: 0x%x, "
- "atom: %s\n",
- e->window, name);
+ "propertynotify: window: 0x%x, atom: %s\n",
+ e->window, name);
free(name);
}
}
#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;
DNPRINTF(SWM_D_EVENT, "screenchange: root: 0x%x\n", e->root);
if (e->rotation & (XCB_RANDR_ROTATION_ROTATE_90
- | XCB_RANDR_ROTATION_ROTATE_270))
+ | XCB_RANDR_ROTATION_ROTATE_270))
xcb_randr_set_screen_size(conn, e->root, e->height,
- e->width, e->mheight, e->mwidth);
+ e->width, e->mheight, e->mwidth);
else
xcb_randr_set_screen_size(conn, e->root, e->width,
- e->height, e->mwidth, e->mheight);
+ e->height, e->mwidth, e->mheight);
num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
/* silly event doesn't include the screen index */
}
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);
}
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);
-
- if (type == 0)
- {
- /* XXX - handle error */
- return;
- }
-
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
{
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);
while (running) {
while ((evt = xcb_poll_for_event(conn))) {
- DNPRINTF(SWM_D_EVENT, "XCB Event: %s\n",
- geteventname(evt));
+ 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);
/* 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)