static void WarpFocusFinish(void) { EWin *ewin; ewin = warplist[warpFocusIndex].ewin; WarpShapeDraw(NULL); WarpFocusHide(); if (!EwinFindByPtr(ewin)) return; EwinOpActivate(ewin, OPSRC_USER, Conf.warplist.raise_on_select); if (Conf.warplist.warp_on_select) EwinWarpTo(ewin, 0); }
static void doFocusToEwin(EWin * ewin, int why) { int do_focus = 0; int do_raise = 0, do_warp = 0; if (focus_inhibit) return; if (EDebug(EDBUG_TYPE_FOCUS)) Eprintf("%s: %#x %s why=%d\n", __func__, (ewin) ? EwinGetClientXwin(ewin) : 0, (ewin) ? EwinGetTitle(ewin) : "None", why); switch (why) { case FOCUS_NEXT: case FOCUS_PREV: if (Conf.focus.raise_on_next) do_raise = 1; if (Conf.focus.warp_on_next) do_warp = 1; /* Fall thru */ default: case FOCUS_SET: case FOCUS_ENTER: case FOCUS_LEAVE: /* Unused */ case FOCUS_CLICK: if (ewin && ewin == Mode.focuswin) return; if (!ewin) /* Unfocus */ break; if (!FocusEwinValid(ewin, 1, why == FOCUS_CLICK, 0)) return; break; case FOCUS_INIT: case FOCUS_DESK_ENTER: ewin = FocusEwinSelect(); break; case FOCUS_DESK_LEAVE: focus_is_set = 0; /* FALLTHROUGH */ case FOCUS_NONE: ewin = NULL; if (ewin == Mode.focuswin) return; break; case FOCUS_EWIN_UNMAP: if (Mode.focuswin) return; ewin = FocusEwinSelect(); if (ewin == Mode.focuswin) ewin = NULL; break; case FOCUS_EWIN_NEW: if (Conf.focus.all_new_windows_get_focus) goto check_focus_new; if (Mode.place.doing_manual) goto check_focus_new; if (ewin->props.focus_when_mapped) goto check_focus_new; if (Conf.focus.new_windows_get_focus_if_group_focused && Mode.focuswin) { if (EwinGetWindowGroup(ewin) == EwinGetWindowGroup(Mode.focuswin)) goto check_focus_new; } if (EwinIsTransient(ewin)) { if (Conf.focus.new_transients_get_focus) { do_focus = 1; } else if (Conf.focus.new_transients_get_focus_if_group_focused && Mode.focuswin) { if ((EwinGetTransientFor(ewin) == EwinGetClientXwin(Mode.focuswin)) || (EwinGetWindowGroup(ewin) == EwinGetWindowGroup(Mode.focuswin))) do_focus = 1; } if (!do_focus) return; DeskGotoByEwin(ewin); goto check_focus_new; } return; check_focus_new: if (!FocusEwinValid(ewin, 1, 0, 0)) return; break; } if (ewin == Mode.focuswin && focus_is_set) return; /* Check if ewin is a valid focus window target */ if (!ewin) goto done; /* NB! ewin != NULL */ if (why != FOCUS_CLICK && ewin->props.focusclick) return; if (Conf.autoraise.enable) { TIMER_DEL(focus_timer_autoraise); if (Conf.focus.mode != MODE_FOCUS_CLICK) TIMER_ADD(focus_timer_autoraise, Conf.autoraise.delay, AutoraiseTimeout, ewin); } if (do_raise) EwinRaise(ewin); if (Conf.focus.warp_always) do_warp = 1; if (do_warp) EwinWarpTo(ewin, 0); switch (why) { case FOCUS_PREV: case FOCUS_NEXT: GrabKeyboardSet(VROOT); /* Causes idler to be called on KeyRelease */ focus_pending_raise = ewin; break; case FOCUS_DESK_ENTER: if (Conf.focus.mode == MODE_FOCUS_CLICK) break; /* FALLTHROUGH */ default: case FOCUS_INIT: EwinListFocusRaise(ewin); break; } SoundPlay(SOUND_FOCUS_SET); done: ClickGrabsUpdate(); /* Unset old focus window (if any) highlighting */ if (Mode.focuswin) FocusEwinSetActive(Mode.focuswin, 0); ICCCM_Cmap(ewin); /* Quit if pointer is not on our screen */ if (!Mode.events.on_screen) { Mode.focuswin = NULL; return; } /* Set new focus window (if any) highlighting */ Mode.focuswin = ewin; if (Mode.focuswin) FocusEwinSetActive(Mode.focuswin, 1); if (why == FOCUS_DESK_LEAVE) return; ICCCM_Focus(ewin); focus_is_set = 1; }
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); }
/* outstanding BUG: zooming on shaped windows leaves stuff exposed beneath them..... */ void Zoom(EWin * ewin, int on) { if (Mode.wm.window) return; if (!ewin) ewin = zoom_last_ewin; if (!ewin) return; if (zoom_can == 0) ZoomInit(); if (zoom_can <= 0) return; Dprintf("%s: on=%d\n", __func__, on); if (!on) { /* Unzoom */ if (ewin != zoom_last_ewin) return; _ZoomEwinRestore(ewin); SwitchRes(0, 0, 0, 0, 0, NULL, NULL); zw = zh = 0; zoom_last_ewin = NULL; } else if (ewin == zoom_last_ewin) { /* Already zoomed */ return; } else { /* Zoom */ if (ewin->state.fullscreen) return; if (!zoom_last_ewin) /* first zoom */ { on = SwitchRes(1, 0, 0, ewin->client.w, ewin->client.h, &zw, &zh); } else /* we are zoomed in on another window already.... */ { _ZoomEwinRestore(zoom_last_ewin); if ((ewin->client.w <= zw) && (ewin->client.h <= zh) && ((ewin->client.w >= zw / 2) || (ewin->client.h >= zh / 2))) { /* YAY no need to change resolution :-D */ } else { /* SwitchRes only tracks the LAST mode, so we have to switch back to * the original mode before switching to new target mode * so that we can restore the original vid mode when we zoom * out of the last window ;( */ SwitchRes(0, 0, 0, 0, 0, NULL, NULL); on = SwitchRes(1, 0, 0, ewin->client.w, ewin->client.h, &zw, &zh); } } Dprintf("%s: SwitchRes=%d - client size %dx%d -> screen %dx%d\n", __func__, on, ewin->client.w, ewin->client.h, zw, zh); if (!on) return; ewin->save_fs.x = EoGetX(ewin); ewin->save_fs.y = EoGetY(ewin); EwinRaise(ewin); EwinBorderSetTo(ewin, BorderCreateFiller(ewin->client.w, ewin->client.h, zw, zh)); EwinMoveResize(ewin, 0, 0, ewin->client.w, ewin->client.h, 0); ewin->state.zoomed = 1; FocusToEWin(ewin, FOCUS_SET); zoom_last_ewin = ewin; } EwinWarpTo(ewin, 1); ESync(0); EwinStateUpdate(ewin); HintsSetWindowState(ewin); }