/** * @brief rejects a window from beeing listed */ bool XfitMan::acceptWindow(Window window) const { { AtomList types = getWindowType(window); AtomList ignoreList; ignoreList << atom("_NET_WM_WINDOW_TYPE_DESKTOP") << atom("_NET_WM_WINDOW_TYPE_DOCK") << atom("_NET_WM_WINDOW_TYPE_SPLASH") << atom("_NET_WM_WINDOW_TYPE_TOOLBAR") << atom("_NET_WM_WINDOW_TYPE_MENU") // for qlipper - using qpopup as a main window << atom("_NET_WM_WINDOW_TYPE_POPUP_MENU"); // issue #284: qmmp its not registered in window list panel // qmmp has _KDE_NET_WM_WINDOW_TYPE_OVERRIDE in its // _NET_WM_WINDOW_TYPE(ATOM) = _KDE_NET_WM_WINDOW_TYPE_OVERRIDE, _NET_WM_WINDOW_TYPE_NORMAL // Let's expect that _KDE_NET_WM_WINDOW_TYPE_OVERRIDE can be set for // regular windows too. If it should be hidden we should expect // one of atoms listed above. // << atom("_KDE_NET_WM_WINDOW_TYPE_OVERRIDE"); foreach (Atom i, ignoreList) { if (types.contains(i)) return false; } WindowState state = getWindowState(window); if (state.SkipTaskBar) return false; } Window transFor = None; // WM_TRANSIENT_FOR hint not set - normal window if (!XGetTransientForHint(QX11Info::display(), window, &transFor)) return true; if (transFor == 0) return true; if (transFor == window) return true; if (transFor == root) return true; AtomList transForTypes = getWindowType(transFor); return !transForTypes.contains(atom("_NET_WM_WINDOW_TYPE_NORMAL")); }
int SPECTACLE_BASE :: init(double p[], int n_args) { float outskip = p[0]; float inskip = p[1]; inputdur = p[2]; amp = p[3]; ringdur = p[4]; fft_len = (int) p[5]; window_len = (int) p[6]; window_type = getWindowType(p[7]); float overlap = p[8]; /* Make sure FFT length is a power of 2 <= MAXFFTLEN and <= RTBUFSAMPS. */ bool valid = false; for (int x = 1; x <= MAXFFTLEN; x *= 2) { if (fft_len == x) { valid = true; break; } } if (!valid || fft_len > MAXFFTLEN) return die(instname(), "FFT length must be a power of two <= %d", MAXFFTLEN); // FIXME: now this isn't a problem; instead, decimation can't be larger // than RTBUFSAMPS. But must couch errmsg in terms of overlap and fft length, // not decimation... #if 0 if (fft_len > RTBUFSAMPS) return die(instname(), "FFT length must be a power of two less than or equal\n" "to the output buffer size set in rtsetparams (currently %d).", RTBUFSAMPS); #endif half_fft_len = fft_len / 2; fund_anal_freq = SR / (float) fft_len; /* Make sure window length is a power of 2 >= FFT length. */ valid = false; for (int x = fft_len; x <= MAXWINDOWLEN; x *= 2) { if (window_len == x) { valid = true; break; } } if (!valid) return die(instname(), "Window length must be a power of two >= FFT length\n" "(currently %d) and <= %d.", fft_len, MAXWINDOWLEN); /* Make sure overlap is a power of 2 in our safety range. */ valid = false; //FIXME: need to adjust MINOVERLAP so that iterations is never 0 in run() // This might depend upon window_len?? for (float x = MINOVERLAP; x <= MAXOVERLAP; x *= 2.0) { if (overlap == x) { valid = true; break; } } if (!valid) return die(instname(), "Overlap must be a power of two between %g and %g.", MINOVERLAP, MAXOVERLAP); int_overlap = (int) overlap; /* derive decimation from overlap */ decimation = (int) (fft_len / overlap); DPRINT2("fft_len=%d, decimation=%d\n", fft_len, decimation); if (pre_init(p, n_args) != 0) /* can modify ringdur */ return DONT_SCHEDULE; iamparray = floc(1); if (iamparray) { int lenamp = fsize(1); tableset(SR, inputdur, lenamp, iamptabs); } else rtcmix_advise(instname(), "Setting input amplitude curve to all 1's."); oamparray = floc(2); if (oamparray) { int lenamp = fsize(2); tableset(SR, inputdur + ringdur, lenamp, oamptabs); } else rtcmix_advise(instname(), "Setting output amplitude curve to all 1's."); if (rtsetinput(inskip, this) == -1) return DONT_SCHEDULE; if (inchan >= inputChannels()) return die(instname(), "You asked for channel %d of a %d-channel file.", inchan, inputChannels()); /* <latency> is the delay before the FFT looks at actual input rather than zero-padding. Need to let inst run long enough to compensate for this. */ window_len_minus_decimation = window_len - decimation; latency = window_len + window_len_minus_decimation; float latency_dur = latency * (1.0 / SR); if (rtsetoutput(outskip, latency_dur + inputdur + ringdur, this) == -1) return DONT_SCHEDULE; total_insamps = (int)(inputdur * SR); /* without latency_dur */ input_end_frame = total_insamps + latency; DPRINT1("input_end_frame=%d\n", input_end_frame); input = new float [window_len]; /* input buffer */ output = new float [window_len]; /* output buffer */ anal_window = new float [window_len]; /* analysis window */ synth_window = new float [window_len]; /* synthesis window */ fft_buf = new float [fft_len]; /* FFT buffer */ anal_chans = new float [fft_len + 2]; /* analysis channels */ if (make_windows() != 0) return DONT_SCHEDULE; /* Delay dry output by window_len - decimation to sync with wet sig. */ drybuf = new float [decimation]; dry_delay = new DLineN(window_len); dry_delay->setDelay((float) window_len_minus_decimation); /* Init iamp and oamp to starting amplitudes. */ iamp = (iamparray == NULL) ? 1.0 : iamparray[0]; oamp = (oamparray == NULL) ? amp : oamparray[0]; skip = (int) (SR / (float) resetval); if (post_init(p, n_args) != 0) return DONT_SCHEDULE; return nSamps(); }