static void MagwinDestroy(MagWindow * mw) { #if USE_TIMER TIMER_DEL(mw->timer); #endif Efree(mw); }
static void EdgeEvent(int dir) { static int lastdir = -1; #if 0 Eprintf("EdgeEvent %d -> %d\n", lastdir, dir); #endif if (lastdir == dir || Conf.desks.edge_flip_mode == EDGE_FLIP_OFF) return; if (Conf.desks.edge_flip_mode == EDGE_FLIP_MOVE && Mode.mode != MODE_MOVE) return; TIMER_DEL(edge_timer); if (dir >= 0) { if (Conf.desks.edge_flip_resistance <= 0) Conf.desks.edge_flip_resistance = 1; TIMER_ADD(edge_timer, 10 * Conf.desks.edge_flip_resistance, EdgeTimeout, INT2PTR(dir)); } lastdir = dir; }
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; }