/* * Filter windows when they are open if they match the filtering rules */ static void colorFilterWindowAdd (CompScreen *s, CompWindow *w) { FILTER_SCREEN (s); /* cfw->isFiltered is initialized to FALSE in InitWindow, so we only have to toggle it to TRUE if necessary */ if (cfs->isFiltered && matchEval (colorfilterGetFilterMatch (s), w)) colorFilterToggleWindow (w); }
/* * Exclude match settings update callback */ static void colorFilterExcludeMatchsChanged (CompScreen *s, CompOption *opt, ColorfilterScreenOptions num) { CompWindow *w; FILTER_SCREEN (s); /* Re-check every window against new match settings */ for (w = s->windows; w; w = w->next) { Bool isExcluded; FILTER_WINDOW (w); isExcluded = matchEval (colorfilterGetExcludeMatch (s), w); if (isExcluded && cfw->isFiltered) colorFilterToggleWindow (w); else if (!isExcluded && cfs->isFiltered && !cfw->isFiltered) colorFilterToggleWindow (w); } }
/* * Filter windows when they are open if they match the filtering rules */ static void colorFilterWindowAddNotify (CompWindow *w) { FILTER_SCREEN (w->screen); /* cfw->isFiltered is initialized to FALSE in InitWindow, so we only have to toggle it to TRUE if necessary */ if (cfs->isFiltered && matchEval (&cfs->filter_match, w)) colorFilterToggleWindow (w); UNWRAP (cfs, w->screen, windowAddNotify); (*w->screen->windowAddNotify) (w); WRAP (cfs, w->screen, windowAddNotify, colorFilterWindowAddNotify); }
/* * Toggle filtering for the whole screen */ static void colorFilterToggleScreen (CompScreen *s) { CompWindow *w; FILTER_SCREEN (s); /* Toggle screen filtering flag */ cfs->isFiltered = !cfs->isFiltered; /* Toggle filtering for every window */ for (w = s->windows; w; w = w->next) if (w) colorFilterToggleWindow (w); }
/* * Window filtering toggle action */ static Bool colorFilterToggle (CompDisplay * d, CompAction * action, CompActionState state, CompOption * option, int nOption) { CompWindow *w; Window xid; xid = getIntOptionNamed (option, nOption, "window", 0); w = findWindowAtDisplay (d, xid); if (w && w->screen->fragmentProgram) colorFilterToggleWindow (w); return TRUE; }
static void colorFilterHandleEvent (XEvent *event) { FILTER_DISPLAY (&display); switch (event->type) { case KeyPress: if (isKeyPressEvent (event, &cfd->toggle_window_key)) { CompWindow *w = findWindowAtDisplay (display.activeWindow); if (w && w->screen->fragmentProgram) colorFilterToggleWindow (w); } else if (isKeyPressEvent (event, &cfd->toggle_screen_key)) { CompScreen *s = findScreenAtDisplay (event->xkey.root); if (s && s->fragmentProgram) colorFilterToggleScreen (s); } else if (isKeyPressEvent (event, &cfd->switch_filter_key)) { CompScreen *s = findScreenAtDisplay (event->xkey.root); if (s && s->fragmentProgram) colorFilterSwitchFilter (s); } break; default: break; } UNWRAP (cfd, &display, handleEvent); (*display.handleEvent) (event); WRAP (cfd, &display, handleEvent, colorFilterHandleEvent); }
static void colorFilterChangeNotify (const char *optionName, BananaType optionType, const BananaValue *optionValue, int screenNum) { FILTER_DISPLAY (&display); if (strcasecmp (optionName, "toggle_window_key") == 0) updateKey (optionValue->s, &cfd->toggle_window_key); else if (strcasecmp (optionName, "toggle_screen_key") == 0) updateKey (optionValue->s, &cfd->toggle_screen_key); else if (strcasecmp (optionName, "switch_filter_key") == 0) updateKey (optionValue->s, &cfd->switch_filter_key); else if (strcasecmp (optionName, "filter_match") == 0) { CompWindow *w; CompScreen *s = getScreenFromScreenNum (screenNum); FILTER_SCREEN (s); //Re-check every window against new match settings for (w = s->windows; w; w = w->next) { FILTER_WINDOW (w); if (matchEval (&cfs->filter_match, w) && cfs->isFiltered && !cfw->isFiltered) { colorFilterToggleWindow (w); } } } else if (strcasecmp (optionName, "exclude_match") == 0) { CompWindow *w; CompScreen *s = getScreenFromScreenNum (screenNum); FILTER_SCREEN (s); // Re-check every window against new match settings for (w = s->windows; w; w = w->next) { Bool isExcluded; FILTER_WINDOW (w); isExcluded = matchEval (&cfs->exclude_match, w); if (isExcluded && cfw->isFiltered) colorFilterToggleWindow (w); else if (!isExcluded && cfs->isFiltered && !cfw->isFiltered) colorFilterToggleWindow (w); } } else if (strcasecmp (optionName, "filters") == 0) { CompScreen *s = getScreenFromScreenNum (screenNum); FILTER_SCREEN (s); /* Just set the filtersLoaded boolean to FALSE, unloadFilters will be * called in loadFilters */ cfs->filtersLoaded = FALSE; } else if (strcasecmp (optionName, "filter_decorations") == 0) { CompScreen *s = getScreenFromScreenNum (screenNum); damageScreen (s); } }