X-Git-Url: https://jasonwoof.com/gitweb/?a=blobdiff_plain;ds=sidebyside;f=spectrwm.c;h=648b0c54dc0e47fb0008a1f6d5da128c770340dc;hb=5d83029a3a9b69ab0f1287aa6c0499b681d891d9;hp=5382bc7d7ab1b1e6f5ad6664832636c76bf3a4b9;hpb=e0f96d62c687fd90290f1bf595bfd3e36b87c7d6;p=spectrwm.git diff --git a/spectrwm.c b/spectrwm.c index 5382bc7..648b0c5 100644 --- a/spectrwm.c +++ b/spectrwm.c @@ -546,7 +546,6 @@ union arg { #define SWM_ARG_ID_FOCUSNEXT (0) #define SWM_ARG_ID_FOCUSPREV (1) #define SWM_ARG_ID_FOCUSMAIN (2) -#define SWM_ARG_ID_FOCUSCUR (4) #define SWM_ARG_ID_SWAPNEXT (10) #define SWM_ARG_ID_SWAPPREV (11) #define SWM_ARG_ID_SWAPMAIN (12) @@ -697,6 +696,7 @@ char *get_atom_name(xcb_atom_t); char *get_notify_detail_label(uint8_t); char *get_notify_mode_label(uint8_t); #endif +struct ws_win *get_region_focus(struct swm_region *); xcb_screen_t *get_screen(int); char *get_win_name(xcb_window_t); uint32_t getstate(xcb_window_t); @@ -2828,7 +2828,6 @@ switchws(struct swm_region *r, union arg *args) struct swm_region *this_r, *other_r; struct ws_win *win; struct workspace *new_ws, *old_ws; - union arg a; if (!(r && r->s)) return; @@ -2863,10 +2862,16 @@ switchws(struct swm_region *r, union arg *args) this_r->ws = new_ws; new_ws->r = this_r; + unfocus_win(old_ws->focus); + stack(); - a.id = SWM_ARG_ID_FOCUSCUR; - focus(new_ws->r, &a); + /* unmap old windows */ + if (unmap_old) + TAILQ_FOREACH(win, &old_ws->winlist, entry) + unmap_window(win); + + new_ws->focus = get_region_focus(new_ws->r); /* unmap old windows */ if (unmap_old) @@ -2948,7 +2953,6 @@ void cyclescr(struct swm_region *r, union arg *args) { struct swm_region *rr = NULL; - union arg a; int i, x, y, num_screens; num_screens = xcb_setup_roots_length(xcb_get_setup(conn)); @@ -2980,8 +2984,7 @@ cyclescr(struct swm_region *r, union arg *args) xcb_warp_pointer(conn, XCB_WINDOW_NONE, rr->s[i].root, 0, 0, 0, 0, x, y); - a.id = SWM_ARG_ID_FOCUSCUR; - focus(rr, &a); + rr->ws->focus = get_region_focus(rr); if (rr->ws->focus) { /* move to focus window */ @@ -3179,11 +3182,30 @@ done: return get_focus_magic(winfocus); } +struct ws_win * +get_region_focus(struct swm_region *r) +{ + struct ws_win *winfocus = NULL; + + if (!(r && r->ws)) + return NULL; + + if (r->ws->focus && !r->ws->focus->iconic) + winfocus = r->ws->focus; + else if (r->ws->focus_prev && !r->ws->focus_prev->iconic) + winfocus = r->ws->focus_prev; + else + TAILQ_FOREACH(winfocus, &r->ws->winlist, entry) + if (!winfocus->iconic) + break; + + return get_focus_magic(winfocus); +} + void focus(struct swm_region *r, union arg *args) { - struct ws_win *winfocus = NULL, *head; - struct ws_win *cur_focus = NULL; + struct ws_win *head, *cur_focus = NULL, *winfocus = NULL; struct ws_win_list *wl = NULL; struct workspace *ws = NULL; int all_iconics; @@ -3193,21 +3215,6 @@ focus(struct swm_region *r, union arg *args) DNPRINTF(SWM_D_FOCUS, "focus: id: %d\n", args->id); - /* treat FOCUS_CUR special */ - if (args->id == SWM_ARG_ID_FOCUSCUR) { - if (r->ws->focus && r->ws->focus->iconic == 0) - winfocus = r->ws->focus; - else if (r->ws->focus_prev && r->ws->focus_prev->iconic == 0) - winfocus = r->ws->focus_prev; - else - TAILQ_FOREACH(winfocus, &r->ws->winlist, entry) - if (winfocus->iconic == 0) - break; - - r->ws->focus = get_focus_magic(winfocus); - return; - } - if ((cur_focus = r->ws->focus) == NULL) return; ws = r->ws; @@ -3287,7 +3294,6 @@ void cycle_layout(struct swm_region *r, union arg *args) { struct workspace *ws = r->ws; - union arg a; /* suppress unused warning since var is needed */ (void)args; @@ -3301,9 +3307,7 @@ cycle_layout(struct swm_region *r, union arg *args) stack(); bar_update(); - a.id = SWM_ARG_ID_FOCUSCUR; - focus(r, &a); - focus_win(r->ws->focus); + focus_win(get_region_focus(r)); focus_flush(); } @@ -4466,7 +4470,6 @@ void floating_toggle(struct swm_region *r, union arg *args) { struct ws_win *win = r->ws->focus; - union arg a; /* suppress unused warning since var is needed */ (void)args; @@ -4482,11 +4485,8 @@ floating_toggle(struct swm_region *r, union arg *args) stack(); - if (win == win->ws->focus) { - a.id = SWM_ARG_ID_FOCUSCUR; - focus(win->ws->r, &a); - focus_win(win->ws->focus); - } + if (win == win->ws->focus) + focus_win(win); focus_flush(); } @@ -6750,12 +6750,12 @@ manage_window(xcb_window_t id, uint16_t mapped) { xcb_window_t trans = XCB_WINDOW_NONE; struct ws_win *win, *ww; - int ws_idx, border_me = 0; + int ws_idx; char ws_idx_str[SWM_PROPLEN]; struct swm_region *r; struct pid_e *p; struct quirk *qp; - uint32_t event_mask, i; + uint32_t i, wa[2]; xcb_icccm_get_wm_protocols_reply_t wpr; if ((win = find_window(id)) != NULL) { @@ -6796,9 +6796,9 @@ manage_window(xcb_window_t id, uint16_t mapped) /* Ignore window border if there is one. */ WIDTH(win) = win->wa->width; HEIGHT(win) = win->wa->height; - X(win) = win->wa->x + win->wa->border_width; - Y(win) = win->wa->y + win->wa->border_width; - win->bordered = 0; + X(win) = win->wa->x + win->wa->border_width - border_width; + Y(win) = win->wa->y + win->wa->border_width - border_width; + win->bordered = 1; win->mapped = mapped; win->floatmaxed = 0; win->ewmh_flags = 0; @@ -6853,7 +6853,6 @@ manage_window(xcb_window_t id, uint16_t mapped) } else if (trans && (ww = find_window(trans)) != NULL) { /* Launch transients in the same ws as parent. */ win->ws = ww->ws; - border_me = 1; } else { win->ws = r->ws; } @@ -6883,7 +6882,6 @@ manage_window(xcb_window_t id, uint16_t mapped) DNPRINTF(SWM_D_CLASS, "manage_window: java window " "detected.\n"); win->java = 1; - border_me = 1; } TAILQ_FOREACH(qp, &quirks, entry) { @@ -6891,20 +6889,16 @@ manage_window(xcb_window_t id, uint16_t mapped) !strcmp(win->ch.instance_name, qp->name)) { DNPRINTF(SWM_D_CLASS, "manage_window: on quirks" "list; mask: 0x%lx\n", qp->quirk); - if (qp->quirk & SWM_Q_FLOAT) { + if (qp->quirk & SWM_Q_FLOAT) win->floating = 1; - border_me = 1; - } win->quirks = qp->quirk; } } } /* Alter window position if quirky */ - if (win->quirks & SWM_Q_ANYWHERE) { + if (win->quirks & SWM_Q_ANYWHERE) win->manual = 1; - border_me = 1; - } /* Reset font sizes (the bruteforce way; no default keybinding). */ if (win->quirks & SWM_Q_XTERM_FONTADJ) { @@ -6914,28 +6908,23 @@ manage_window(xcb_window_t id, uint16_t mapped) fake_keypress(win, XK_KP_Add, XCB_MOD_MASK_SHIFT); } - if (border_me) { - win->bordered = 1; - X(win) -= border_width; - Y(win) -= border_width; - } - /* Make sure window is positioned inside its region, if its active. */ - if (win->ws->r) + if (win->ws->r) { constrain_window(win, win->ws->r, 0); - - if (win->ws->r || border_me) update_window(win); + } - /* Select which X events to monitor. */ - event_mask = XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_FOCUS_CHANGE | - XCB_EVENT_MASK_PROPERTY_CHANGE | XCB_EVENT_MASK_STRUCTURE_NOTIFY; + + /* Select which X events to monitor and set border pixel color. */ + wa[0] = win->s->c[SWM_S_COLOR_UNFOCUS].pixel; + wa[1] = XCB_EVENT_MASK_ENTER_WINDOW | XCB_EVENT_MASK_PROPERTY_CHANGE | + XCB_EVENT_MASK_STRUCTURE_NOTIFY; #ifdef SWM_DEBUG - event_mask |= XCB_EVENT_MASK_LEAVE_WINDOW; + wa[1] |= XCB_EVENT_MASK_LEAVE_WINDOW | XCB_EVENT_MASK_FOCUS_CHANGE; #endif - xcb_change_window_attributes(conn, win->id, XCB_CW_EVENT_MASK, - &event_mask); + xcb_change_window_attributes(conn, win->id, XCB_CW_BORDER_PIXEL | + XCB_CW_EVENT_MASK, wa); out: /* Figure out where to stack the window in the workspace. */ @@ -8279,7 +8268,6 @@ main(int argc, char *argv[]) { struct swm_region *r, *rr; struct ws_win *winfocus = NULL; - union arg a; char conf[PATH_MAX], *cfile = NULL; struct stat sb; int xfd, i, num_screens; @@ -8436,9 +8424,7 @@ noconfig: 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); - focus_win(rr->ws->focus); + focus_win(get_region_focus(rr)); focus_flush(); winfocus = NULL; continue;