mirror of
https://github.com/vale981/spectrwm
synced 2025-03-05 09:51:38 -05:00
Update code to compile against XCB util-wm >= 0.3.8
XCB ICCCM public functions, types and macros are now prefixed. A temporary fix has been added for OpenBSD. Needs improvement. Resolve a variable naming conflict. Set num_screens in unmap_all. In workaround(), utf8_string should be netwmname, not netwmcheck. Initialize some uninitialized pointers. Update debug printf format to reflect new xcb variable types. Vacuum up whitespace. Add XCB libs to linux Makefile
This commit is contained in:
parent
8ed4457ecc
commit
90f1696b7a
2 changed files with 100 additions and 88 deletions
|
@ -1,6 +1,6 @@
|
|||
CFLAGS+= -Wall -g -D_GNU_SOURCE -I.
|
||||
CFLAGS+= -DSWM_LIB=\"$(LIBDIR)/libswmhack.so.$(LVERS)\"
|
||||
LDADD+= -lX11 -lXrandr -lXtst
|
||||
LDADD+= -lX11 -lXrandr -lXtst -lX11-xcb -lxcb -lxcb-icccm -lxcb-randr -lxcb-keysyms
|
||||
|
||||
PREFIX?= /usr/local
|
||||
BINDIR?= $(PREFIX)/bin
|
||||
|
|
92
spectrwm.c
92
spectrwm.c
|
@ -121,6 +121,17 @@ static const char *buildstr = SPECTRWM_VERSION;
|
|||
#endif
|
||||
#endif
|
||||
|
||||
#if defined(__OpenBSD__)
|
||||
#define xcb_icccm_wm_hints_t xcb_wm_hints_t
|
||||
#define xcb_icccm_get_wm_hints xcb_get_wm_hints
|
||||
#define XCB_ICCCM_WM_HINT_X_URGENCY XCB_WM_HINT_X_URGENCY
|
||||
#define XCB_ICCCM_WM_STATE_ICONIC XCB_WM_STATE_ICONIC
|
||||
#define XCB_ICCCM_WM_STATE_WITHDRAWN XCB_WM_STATE_WITHDRAWN
|
||||
#define XCB_ICCCM_WM_STATE_NORMAL XCB_WM_STATE_NORMAL
|
||||
#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
|
||||
#endif
|
||||
|
||||
/*#define SWM_DEBUG*/
|
||||
#ifdef SWM_DEBUG
|
||||
#define DPRINTF(x...) do { if (swm_debug) fprintf(stderr, x); } while (0)
|
||||
|
@ -723,7 +734,7 @@ get_iconic(struct ws_win *win)
|
|||
int32_t v = 0, *vtmp;
|
||||
xcb_atom_t iprop;
|
||||
xcb_get_property_cookie_t pc;
|
||||
xcb_get_property_reply_t *pr;
|
||||
xcb_get_property_reply_t *pr = NULL;
|
||||
|
||||
iprop = get_atom_from_string("_SWM_ICONIC");
|
||||
if (iprop == XCB_ATOM_NONE)
|
||||
|
@ -853,7 +864,7 @@ ewmh_set_win_fullscreen(struct ws_win *win, int fs)
|
|||
if (!win->floating)
|
||||
return (0);
|
||||
|
||||
DNPRINTF(SWM_D_MISC, "ewmh_set_win_fullscreen: window: 0x%lx, "
|
||||
DNPRINTF(SWM_D_MISC, "ewmh_set_win_fullscreen: window: 0x%x, "
|
||||
"fullscreen %s\n", win->id, YESNO(fs));
|
||||
|
||||
if (fs) {
|
||||
|
@ -1170,8 +1181,8 @@ dumpwins(struct swm_region *r, union arg *args)
|
|||
c = xcb_get_window_attributes(conn, win->id);
|
||||
wa = xcb_get_window_attributes_reply(conn, c, NULL);
|
||||
if (wa) {
|
||||
warnx("window: 0x%lx, map_state: %d, state: %u, "
|
||||
"transient: 0x%lx", win->id, wa->map_state,
|
||||
warnx("window: 0x%x, map_state: %d, state: %u, "
|
||||
"transient: 0x%x", win->id, wa->map_state,
|
||||
state, win->transient);
|
||||
free(wa);
|
||||
} else
|
||||
|
@ -1531,7 +1542,7 @@ bar_urgent(char *s, size_t sz)
|
|||
int i, j, num_screens;
|
||||
char b[8];
|
||||
xcb_get_property_cookie_t c;
|
||||
xcb_wm_hints_t hints;
|
||||
xcb_icccm_wm_hints_t hints;
|
||||
|
||||
for (i = 0; i < workspace_limit; i++)
|
||||
urgent[i] = 0;
|
||||
|
@ -1540,11 +1551,11 @@ bar_urgent(char *s, size_t sz)
|
|||
for (i = 0; i < num_screens; i++)
|
||||
for (j = 0; j < workspace_limit; j++)
|
||||
TAILQ_FOREACH(win, &screens[i].ws[j].winlist, entry) {
|
||||
c = xcb_get_wm_hints(conn, win->id);
|
||||
if (xcb_get_wm_hints_reply(conn, c,
|
||||
c = xcb_icccm_get_wm_hints(conn, win->id);
|
||||
if (xcb_icccm_get_wm_hints_reply(conn, c,
|
||||
&hints, NULL) == 0)
|
||||
continue;
|
||||
if (hints.flags & XCB_WM_HINT_X_URGENCY)
|
||||
if (hints.flags & XCB_ICCCM_WM_HINT_X_URGENCY)
|
||||
urgent[j] = 1;
|
||||
}
|
||||
|
||||
|
@ -1972,7 +1983,7 @@ bar_setup(struct swm_region *r)
|
|||
if (bar_enabled)
|
||||
map_window_raised(r->bar->id);
|
||||
|
||||
DNPRINTF(SWM_D_BAR, "bar_setup: window: 0x%lx, (x,y) w x h: (%d,%d) "
|
||||
DNPRINTF(SWM_D_BAR, "bar_setup: window: 0x%x, (x,y) w x h: (%d,%d) "
|
||||
"%d x %d\n", WINID(r->bar), X(r->bar), Y(r->bar), WIDTH(r->bar),
|
||||
HEIGHT(r->bar));
|
||||
|
||||
|
@ -2183,10 +2194,10 @@ unmap_window(struct ws_win *win)
|
|||
return;
|
||||
|
||||
/* don't unmap again */
|
||||
if (getstate(win->id) == XCB_WM_STATE_ICONIC)
|
||||
if (getstate(win->id) == XCB_ICCCM_WM_STATE_ICONIC)
|
||||
return;
|
||||
|
||||
set_win_state(win, XCB_WM_STATE_ICONIC);
|
||||
set_win_state(win, XCB_ICCCM_WM_STATE_ICONIC);
|
||||
|
||||
xcb_unmap_window(conn, win->id);
|
||||
xcb_change_window_attributes(conn, win->id,
|
||||
|
@ -2199,6 +2210,7 @@ unmap_all(void)
|
|||
struct ws_win *win;
|
||||
int i, j, num_screens;
|
||||
|
||||
num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
|
||||
for (i = 0; i < num_screens; i++)
|
||||
for (j = 0; j < workspace_limit; j++)
|
||||
TAILQ_FOREACH(win, &screens[i].ws[j].winlist, entry)
|
||||
|
@ -2475,7 +2487,7 @@ unfocus_win(struct ws_win *win)
|
|||
XEvent cne;
|
||||
xcb_window_t none = XCB_WINDOW_NONE;
|
||||
|
||||
DNPRINTF(SWM_D_FOCUS, "unfocus_win: window: 0x%lx\n", WINID(win));
|
||||
DNPRINTF(SWM_D_FOCUS, "unfocus_win: window: 0x%x\n", WINID(win));
|
||||
|
||||
if (win == NULL)
|
||||
return;
|
||||
|
@ -2543,7 +2555,7 @@ focus_win(struct ws_win *win)
|
|||
xcb_get_input_focus_reply_t *r;
|
||||
xcb_window_t cur_focus = XCB_WINDOW_NONE;
|
||||
|
||||
DNPRINTF(SWM_D_FOCUS, "focus_win: window: 0x%lx\n", WINID(win));
|
||||
DNPRINTF(SWM_D_FOCUS, "focus_win: window: 0x%x\n", WINID(win));
|
||||
|
||||
if (win == NULL)
|
||||
return;
|
||||
|
@ -2883,7 +2895,7 @@ focus_prev(struct ws_win *win)
|
|||
wl = &ws->winlist;
|
||||
cur_focus = ws->focus;
|
||||
|
||||
DNPRINTF(SWM_D_FOCUS, "focus_prev: window: 0x%lx, cur_focus: 0x%lx\n",
|
||||
DNPRINTF(SWM_D_FOCUS, "focus_prev: window: 0x%x, cur_focus: 0x%x\n",
|
||||
WINID(win), WINID(cur_focus));
|
||||
|
||||
/* pickle, just focus on whatever */
|
||||
|
@ -3143,7 +3155,7 @@ store_float_geom(struct ws_win *win, struct swm_region *r)
|
|||
win->g_float.x -= X(r);
|
||||
win->g_float.y -= Y(r);
|
||||
win->g_floatvalid = 1;
|
||||
DNPRINTF(SWM_D_MISC, "store_float_geom: window: 0x%lx, g: (%d,%d)"
|
||||
DNPRINTF(SWM_D_MISC, "store_float_geom: window: 0x%x, g: (%d,%d)"
|
||||
" %d x %d, g_float: (%d,%d) %d x %d\n", win->id, X(win), Y(win),
|
||||
WIDTH(win), HEIGHT(win), win->g_float.x, win->g_float.y,
|
||||
win->g_float.w, win->g_float.h);
|
||||
|
@ -3155,7 +3167,7 @@ stack_floater(struct ws_win *win, struct swm_region *r)
|
|||
if (win == NULL)
|
||||
return;
|
||||
|
||||
DNPRINTF(SWM_D_MISC, "stack_floater: window: 0x%lx\n", win->id);
|
||||
DNPRINTF(SWM_D_MISC, "stack_floater: window: 0x%x\n", win->id);
|
||||
|
||||
/*
|
||||
* to allow windows to change their size (e.g. mplayer fs) only retrieve
|
||||
|
@ -3644,7 +3656,7 @@ send_to_ws(struct swm_region *r, union arg *args)
|
|||
if (win->ws->idx == wsid)
|
||||
return;
|
||||
|
||||
DNPRINTF(SWM_D_MOVE, "send_to_ws: window: 0x%lx\n", win->id);
|
||||
DNPRINTF(SWM_D_MOVE, "send_to_ws: window: 0x%x\n", win->id);
|
||||
|
||||
ws = win->ws;
|
||||
nws = &win->s->ws[wsid];
|
||||
|
@ -4268,8 +4280,8 @@ resize(struct ws_win *win, union arg *args)
|
|||
if (win->ewmh_flags & EWMH_F_FULLSCREEN)
|
||||
return;
|
||||
|
||||
DNPRINTF(SWM_D_MOUSE, "resize: window: 0x%lx, floating: %s, "
|
||||
"transient: 0x%lx\n", win->id, YESNO(win->floating),
|
||||
DNPRINTF(SWM_D_MOUSE, "resize: window: 0x%x, floating: %s, "
|
||||
"transient: 0x%x\n", win->id, YESNO(win->floating),
|
||||
win->transient);
|
||||
|
||||
if (!(win->transient != 0 || win->floating != 0))
|
||||
|
@ -4454,8 +4466,8 @@ move(struct ws_win *win, union arg *args)
|
|||
if (win->ewmh_flags & EWMH_F_FULLSCREEN)
|
||||
return;
|
||||
|
||||
DNPRINTF(SWM_D_MOUSE, "move: window: 0x%lx, floating: %s, transient: "
|
||||
"0x%lx\n", win->id, YESNO(win->floating), win->transient);
|
||||
DNPRINTF(SWM_D_MOUSE, "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 */
|
||||
if (win->ws->cur_layout == &layouts[SWM_MAX_STACK] && !win->transient)
|
||||
|
@ -6229,7 +6241,7 @@ set_child_transient(struct ws_win *win, Window *trans)
|
|||
parent->child_trans = win;
|
||||
else {
|
||||
DNPRINTF(SWM_D_MISC, "set_child_transient: parent doesn't exist"
|
||||
" for 0x%lx trans 0x%lx\n", win->id, win->transient);
|
||||
" for 0x%x trans 0x%x\n", win->id, win->transient);
|
||||
|
||||
if (win->hints == NULL) {
|
||||
warnx("no hints for 0x%x", win->id);
|
||||
|
@ -6328,7 +6340,7 @@ manage_window(xcb_window_t id)
|
|||
/* see if we are on the unmanaged list */
|
||||
if ((win = find_unmanaged_window(id)) != NULL) {
|
||||
DNPRINTF(SWM_D_MISC, "manage_window: previously unmanaged "
|
||||
"window: 0x%lx\n", win->id);
|
||||
"window: 0x%x\n", win->id);
|
||||
TAILQ_REMOVE(&win->ws->unmanagedlist, win, entry);
|
||||
if (win->transient)
|
||||
set_child_transient(win, &trans);
|
||||
|
@ -6379,8 +6391,8 @@ manage_window(xcb_window_t id)
|
|||
if (trans) {
|
||||
win->transient = trans;
|
||||
set_child_transient(win, &trans);
|
||||
DNPRINTF(SWM_D_MISC, "manage_window: window: 0x%lx, "
|
||||
"transient: 0x%lx\n", win->id, win->transient);
|
||||
DNPRINTF(SWM_D_MISC, "manage_window: window: 0x%x, "
|
||||
"transient: 0x%x\n", win->id, win->transient);
|
||||
}
|
||||
|
||||
/* get supported protocols */
|
||||
|
@ -6465,7 +6477,7 @@ manage_window(xcb_window_t id)
|
|||
win->floatmaxed = 0;
|
||||
win->ewmh_flags = 0;
|
||||
|
||||
DNPRINTF(SWM_D_MISC, "manage_window: window: 0x%lx, (x,y) w x h: "
|
||||
DNPRINTF(SWM_D_MISC, "manage_window: window: 0x%x, (x,y) w x h: "
|
||||
"(%d,%d) %d x %d, ws: %d\n", win->id, X(win), Y(win), WIDTH(win),
|
||||
HEIGHT(win), ws->idx);
|
||||
|
||||
|
@ -6556,13 +6568,13 @@ manage_window(xcb_window_t id)
|
|||
void
|
||||
free_window(struct ws_win *win)
|
||||
{
|
||||
DNPRINTF(SWM_D_MISC, "free_window: window: 0x%lx\n", win->id);
|
||||
DNPRINTF(SWM_D_MISC, "free_window: window: 0x%x\n", win->id);
|
||||
|
||||
if (win == NULL)
|
||||
return;
|
||||
|
||||
/* needed for restart wm */
|
||||
set_win_state(win, XCB_WM_STATE_WITHDRAWN);
|
||||
set_win_state(win, XCB_ICCCM_WM_STATE_WITHDRAWN);
|
||||
|
||||
TAILQ_REMOVE(&win->ws->unmanagedlist, win, entry);
|
||||
|
||||
|
@ -6588,7 +6600,7 @@ unmanage_window(struct ws_win *win)
|
|||
if (win == NULL)
|
||||
return;
|
||||
|
||||
DNPRINTF(SWM_D_MISC, "unmanage_window: window: 0x%lx\n", win->id);
|
||||
DNPRINTF(SWM_D_MISC, "unmanage_window: window: 0x%x\n", win->id);
|
||||
|
||||
if (win->transient) {
|
||||
parent = find_window(win->transient);
|
||||
|
@ -6615,7 +6627,7 @@ unmanage_window(struct ws_win *win)
|
|||
void
|
||||
focus_magic(struct ws_win *win)
|
||||
{
|
||||
DNPRINTF(SWM_D_FOCUS, "focus_magic: window: 0x%lx\n", WINID(win));
|
||||
DNPRINTF(SWM_D_FOCUS, "focus_magic: window: 0x%x\n", WINID(win));
|
||||
|
||||
if (win == NULL) {
|
||||
/* if there are no windows clear the status-bar */
|
||||
|
@ -6963,7 +6975,7 @@ mapnotify(XEvent *e)
|
|||
|
||||
win = manage_window(ev->window);
|
||||
if (win)
|
||||
set_win_state(win, XCB_WM_STATE_NORMAL);
|
||||
set_win_state(win, XCB_ICCCM_WM_STATE_NORMAL);
|
||||
|
||||
/*
|
||||
* focus_win can only set input focus on a mapped window.
|
||||
|
@ -7071,7 +7083,7 @@ unmapnotify(XEvent *e)
|
|||
if (win == NULL)
|
||||
return;
|
||||
|
||||
if (getstate(e->xunmap.window) == XCB_WM_STATE_NORMAL) {
|
||||
if (getstate(e->xunmap.window) == XCB_ICCCM_WM_STATE_NORMAL) {
|
||||
unmanage_window(win);
|
||||
stack();
|
||||
|
||||
|
@ -7297,7 +7309,7 @@ scan_xrandr(int i)
|
|||
xcb_randr_get_screen_resources_cookie_t src;
|
||||
xcb_randr_get_screen_resources_reply_t *srr;
|
||||
xcb_randr_get_crtc_info_cookie_t cic;
|
||||
xcb_randr_get_crtc_info_reply_t *cir;
|
||||
xcb_randr_get_crtc_info_reply_t *cir = NULL;
|
||||
xcb_randr_crtc_t *crtc;
|
||||
|
||||
num_screens = xcb_setup_roots_length(xcb_get_setup(conn));
|
||||
|
@ -7418,15 +7430,15 @@ grab_windows(void)
|
|||
continue;
|
||||
}
|
||||
|
||||
pc = xcb_get_wm_transient_for(conn, wins[j]);
|
||||
if (xcb_get_wm_transient_for_reply(conn, pc, &wins[j],
|
||||
pc = xcb_icccm_get_wm_transient_for(conn, wins[j]);
|
||||
if (xcb_icccm_get_wm_transient_for_reply(conn, pc, &wins[j],
|
||||
NULL)) {
|
||||
free(r);
|
||||
continue;
|
||||
}
|
||||
|
||||
state = getstate(wins[j]);
|
||||
manage = state == XCB_WM_STATE_ICONIC;
|
||||
manage = state == XCB_ICCCM_WM_STATE_ICONIC;
|
||||
if (r->map_state == XCB_MAP_STATE_VIEWABLE || manage)
|
||||
manage_window(wins[j]);
|
||||
free(r);
|
||||
|
@ -7444,9 +7456,9 @@ grab_windows(void)
|
|||
free(r);
|
||||
|
||||
state = getstate(wins[j]);
|
||||
manage = state == XCB_WM_STATE_ICONIC;
|
||||
pc = xcb_get_wm_transient_for(conn, wins[j]);
|
||||
if (xcb_get_wm_transient_for_reply(conn, pc, &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)
|
||||
manage_window(wins[j]);
|
||||
}
|
||||
|
@ -7568,7 +7580,7 @@ workaround(void)
|
|||
xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win,
|
||||
netwmcheck, XCB_ATOM_WINDOW, 32, 1, &win);
|
||||
xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win,
|
||||
netwmcheck, utf8_string, 8, strlen("LG3D"), "LG3D");
|
||||
netwmname, utf8_string, 8, strlen("LG3D"), "LG3D");
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue