/*
 * 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);
    }
}
Пример #3
0
/*
 * 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);
}
Пример #4
0
/*
 * 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;
}
Пример #6
0
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);
}
Пример #7
0
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);
	}
}