/* * dir > 0: Focus previously focused window * else : Focus least recently focused window */ static void FocusCycleEwin(int dir) { EWin *const *lst; EWin *ewin; int i, j, num; lst = EwinListFocusGet(&num); if (num <= 1) return; dir = (dir > 0) ? 1 : -1; for (j = 0; j < num; j++) { if (lst[j] == Mode.focuswin) break; } for (i = 1; i < num; i++) { ewin = lst[(j + i * dir + num) % num]; if (!FocusEwinValid(ewin, 1, 0, 0) || ewin->props.skip_focuslist) continue; FocusToEWin(ewin, FOCUS_PREV); break; } }
/* * Return the ewin to focus after entering area or losing focused window. */ static EWin * FocusEwinSelect(void) { EWin *const *lst, *ewin; int num, i; switch (Conf.focus.mode) { default: case MODE_FOCUS_POINTER: ewin = GetEwinPointerInClient(); if (ewin && !FocusEwinValid(ewin, 1, 0, 0)) ewin = NULL; break; case MODE_FOCUS_SLOPPY: ewin = GetEwinPointerInClient(); if (ewin && FocusEwinValid(ewin, 1, 0, 0)) break; goto do_select; case MODE_FOCUS_CLICK: goto do_select; do_select: ewin = NULL; lst = EwinListFocusGet(&num); for (i = 0; i < num; i++) { if (!FocusEwinValid(lst[i], 1, 0, 0) || lst[i]->props.skip_focuslist) continue; ewin = lst[i]; break; } break; } return ewin; }
void WarpFocus(int delta) { WarpFocusWin *fw = warpFocusWindow; EWin *const *lst; EWin *ewin; int i, num; WarplistItem *wl; /* Remember invoking keycode (ugly hack) */ if (!fw || !EoIsShown(fw)) { warpFocusKey = Mode.events.last_keycode; warpFocusState = Mode.events.last_keystate; } if (!warplist) { warplist_num = 0; /* Not necessary but silences clang */ lst = EwinListFocusGet(&num); for (i = 0; i < num; i++) { ewin = lst[i]; if ( /* Either visible or iconified */ ((EwinIsOnScreen(ewin)) || (ewin->state.iconified) || (Conf.warplist.showalldesks)) && /* Exclude windows that explicitely say so */ (!ewin->props.skip_focuslist) && (!ewin->props.skip_ext_task) && /* Keep shaded windows if conf say so */ ((!ewin->state.shaded) || (Conf.warplist.showshaded)) && /* Keep sticky windows if conf say so */ ((!EoIsSticky(ewin)) || (Conf.warplist.showsticky)) && /* Keep iconified windows if conf say so */ ((!ewin->state.iconified) || (Conf.warplist.showiconified))) { warplist_num++; warplist = EREALLOC(WarplistItem, warplist, warplist_num); wl = warplist + warplist_num - 1; wl->ewin = ewin; } } /* Hmmm. Hack... */ if (warplist_num >= 2 && warplist[1].ewin == GetFocusEwin()) { warplist[1].ewin = warplist[0].ewin; warplist[0].ewin = GetFocusEwin(); } warpFocusIndex = 0; } if (!warplist) return; warpFocusIndex = (warpFocusIndex + warplist_num + delta) % warplist_num; ewin = warplist[warpFocusIndex].ewin; if (!EwinFindByPtr(ewin)) ewin = NULL; if (!ewin) return; WarpFocusShow(); if (!EwinIsOnScreen(ewin)) return; if (Conf.warplist.show_shape) WarpShapeDraw(ewin); if (Conf.focus.raise_on_next) EwinRaise(ewin); if (Conf.focus.warp_on_next) EwinWarpTo(ewin, 0); if (Conf.warplist.warpfocused) FocusToEWin(ewin, FOCUS_SET); }