#define SH_INC_H(w) (w)->sh.height_inc
#define SWM_MAX_FONT_STEPS (3)
#define WINID(w) ((w) ? (w)->id : XCB_WINDOW_NONE)
+#define WS_FOCUSED(ws) ((ws)->r && (ws)->r->s->r_focus == (ws)->r)
#define YESNO(x) ((x) ? "yes" : "no")
/* Constrain Window flags */
void
switchws(struct swm_region *r, union arg *args)
{
- int wsid = args->id, unmap_old = 0;
struct swm_region *this_r, *other_r;
struct ws_win *win;
struct workspace *new_ws, *old_ws;
+ xcb_window_t none = XCB_WINDOW_NONE;
+ int wsid = args->id, unmap_old = 0;
if (!(r && r->s))
return;
if (new_ws == old_ws)
return;
- unfocus_win(old_ws->focus);
+ if ((win = old_ws->focus) != NULL) {
+ xcb_change_window_attributes(conn, win->id, XCB_CW_BORDER_PIXEL,
+ &win->ws->r->s->c[SWM_S_COLOR_UNFOCUS].pixel);
+
+ xcb_change_property(conn, XCB_PROP_MODE_REPLACE, win->s->root,
+ ewmh[_NET_ACTIVE_WINDOW].atom, XCB_ATOM_WINDOW, 32, 1,
+ &none);
+ }
other_r = new_ws->r;
if (other_r == NULL) {
/* Set focus_pending before stacking, if needed. */
if (focus_mode != SWM_FOCUS_FOLLOW && (!new_ws->focus_pending ||
- validate_win(new_ws->focus_pending)))
+ validate_win(new_ws->focus_pending))) {
new_ws->focus_pending = get_region_focus(new_ws->r);
+ new_ws->focus = new_ws->focus_prev;
+ new_ws->focus_prev = NULL;
+ }
stack();
int
floating_toggle_win(struct ws_win *win)
{
- struct swm_region *r;
-
if (win == NULL)
return (0);
if (!win->ws->r)
return (0);
- r = win->ws->r;
-
/* reject floating toggles in max stack mode */
if (win->ws->cur_layout == &layouts[SWM_MAX_STACK])
return (0);
{
xcb_timestamp_t timestamp = 0;
int move_stp = 0, moving;
- struct swm_region *r = NULL;
xcb_query_pointer_reply_t *qpr = NULL;
xcb_generic_event_t *evt;
xcb_motion_notify_event_t *mne;
if (win == NULL)
return;
- r = win->ws->r;
if (win->ewmh_flags & EWMH_F_FULLSCREEN)
return;
unmanage_window(win);
stack();
- if (focus_mode != SWM_FOCUS_FOLLOW) {
+ if (focus_mode != SWM_FOCUS_FOLLOW && WS_FOCUSED(win->ws)) {
if (win->ws->focus_pending) {
focus_win(win->ws->focus_pending);
win->ws->focus_pending = NULL;
- } else if (win == win->ws->focus && win->ws->r) {
+ } else if (win == win->ws->focus) {
xcb_set_input_focus(conn, XCB_INPUT_FOCUS_PARENT,
win->ws->r->id, XCB_CURRENT_TIME);
}
win->mapped = 1;
set_win_state(win, XCB_ICCCM_WM_STATE_NORMAL);
- if (focus_mode != SWM_FOCUS_FOLLOW) {
+ if (focus_mode != SWM_FOCUS_FOLLOW && WS_FOCUSED(win->ws)) {
if (win->ws->focus_pending == win) {
focus_win(win);
win->ws->focus_pending = NULL;
if (ws->r) {
stack();
- if (focus_mode != SWM_FOCUS_FOLLOW) {
+ if (focus_mode != SWM_FOCUS_FOLLOW &&
+ WS_FOCUSED(ws)) {
if (ws->focus_pending) {
focus_win(ws->focus_pending);
ws->focus_pending = NULL;
} else if (e->atom == a_state) {
/* State just changed, make sure it gets focused if mapped. */
if (e->state == XCB_PROPERTY_NEW_VALUE) {
- if (focus_mode != SWM_FOCUS_FOLLOW) {
+ if (focus_mode != SWM_FOCUS_FOLLOW && WS_FOCUSED(ws)) {
if (win->mapped &&
ws->focus_pending == win) {
focus_win(ws->focus_pending);
if (ws->r)
stack();
- if (focus_mode == SWM_FOCUS_FOLLOW) {
- if (ws->r)
+ if (WS_FOCUSED(ws)) {
+ if (focus_mode == SWM_FOCUS_FOLLOW) {
focus_win(get_pointer_win(ws->r->s->root));
- } else if (ws->focus_pending) {
- focus_win(ws->focus_pending);
- ws->focus_pending = NULL;
- } else if (ws->focus == NULL && ws->r) {
- xcb_set_input_focus(conn, XCB_INPUT_FOCUS_PARENT,
- ws->r->id, XCB_CURRENT_TIME);
+ } else if (ws->focus_pending) {
+ focus_win(ws->focus_pending);
+ ws->focus_pending = NULL;
+ } else if (ws->focus == NULL) {
+ xcb_set_input_focus(conn, XCB_INPUT_FOCUS_PARENT,
+ ws->r->id, XCB_CURRENT_TIME);
+ }
}
}
if (e->type == ewmh[_NET_ACTIVE_WINDOW].atom) {
DNPRINTF(SWM_D_EVENT, "clientmessage: _NET_ACTIVE_WINDOW\n");
- focus_win(win);
+ if (WS_FOCUSED(win->ws))
+ focus_win(win);
+ else
+ win->ws->focus_pending = win;
}
if (e->type == ewmh[_NET_CLOSE_WINDOW].atom) {
DNPRINTF(SWM_D_EVENT, "clientmessage: _NET_CLOSE_WINDOW\n");