#include "group.h"

/**
 *
 * Beryl group plugin
 *
 * queues.c
 *
 * Copyright : (C) 2006 by Patrick Niklaus, Roi Cohen, Danny Baumann
 * Authors: Patrick Niklaus <patrick.niklaus@googlemail.com>
 *          Roi Cohen       <roico@beryl-project.org>
 *          Danny Baumann   <maniac@beryl-project.org>
 *
 *
 * This program is free software; you can redistribute it and/or
 * modify it under the terms of the GNU General Public License
 * as published by the Free Software Foundation; either version 2
 * of the License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 **/

/*
 * functions enqueuing pending notifies
 *
 */

void groupEnqueueMoveNotify (CompWindow *w, int dx, int dy, Bool sync)
{
	GroupPendingMoves *move;

	GROUP_SCREEN (w->screen);

	move = malloc (sizeof(GroupPendingMoves));

	if (!move)
		return;

	move->w = w;
	move->dx = dx;
	move->dy = dy;
	move->sync = sync;
	move->next = NULL;

	if (gs->pendingMoves)
	{
		GroupPendingMoves *temp;
		for (temp = gs->pendingMoves; temp->next; temp = temp->next);

		temp->next = move;
	}
	
	else
		gs->pendingMoves = move;

	/* damageScreen to make sure the queue is emptied */
	addWindowDamage (w);
}

void groupDequeueMoveNotifies (CompScreen *s)
{
	GroupPendingMoves *move;

	GROUP_SCREEN (s);

	gs->queued = TRUE;

	while (gs->pendingMoves)
	{
		move = gs->pendingMoves;
		gs->pendingMoves = move->next;
		
		moveWindow (move->w, move->dx, move->dy, TRUE, FALSE);
		if (move->sync)
		    syncWindowPosition(move->w);

		free (move);
	}

	gs->queued = FALSE;
}

void groupEnqueueGrabNotify (CompWindow *w, int x, int y,
	unsigned int state, unsigned int mask)
{
	GroupPendingGrabs *grab;

	GROUP_SCREEN (w->screen);

	grab = malloc (sizeof(GroupPendingGrabs));

	if (!grab)
		return;

	grab->w = w;
	grab->x = x;
	grab->y = y;
	grab->state = state;
	grab->mask = mask;
	grab->next = NULL;

	if (gs->pendingGrabs)
	{
		GroupPendingGrabs *temp;
		for (temp = gs->pendingGrabs; temp->next; temp = temp->next);

		temp->next = grab;
	}
	else
		gs->pendingGrabs = grab;

	/* damageScreen to make sure the queue is emptied */
	addWindowDamage (w);
}

void groupDequeueGrabNotifies (CompScreen *s)
{
	GroupPendingGrabs *grab;

	GROUP_SCREEN (s);

	gs->queued = TRUE;

	while (gs->pendingGrabs)
	{
		grab = gs->pendingGrabs;
		gs->pendingGrabs = gs->pendingGrabs->next;
		
		(*(grab->w)->screen->windowGrabNotify) (grab->w, grab->x, grab->y, grab->state, grab->mask);

		free (grab);
	}

	gs->queued = FALSE;
}

void groupEnqueueUngrabNotify (CompWindow *w)
{
	GroupPendingUngrabs *ungrab;

	GROUP_SCREEN (w->screen);

	ungrab = malloc (sizeof(GroupPendingUngrabs));

	if (!ungrab)
		return;

	ungrab->w = w;
	ungrab->next = NULL;

	if (gs->pendingUngrabs)
	{
		GroupPendingUngrabs *temp;
		for (temp = gs->pendingUngrabs; temp->next; temp = temp->next);

		temp->next = ungrab;
	}
	
	else
		gs->pendingUngrabs = ungrab;

	/* damageScreen to make sure the queue is emptied */
	addWindowDamage (w);
}

void groupDequeueUngrabNotifies (CompScreen *s)
{
	GroupPendingUngrabs *ungrab;

	GROUP_SCREEN (s);

	gs->queued = TRUE;
	
	while (gs->pendingUngrabs)
	{
		ungrab = gs->pendingUngrabs;
		gs->pendingUngrabs = gs->pendingUngrabs->next;
		
		(*(ungrab->w)->screen->windowUngrabNotify) (ungrab->w);

		free (ungrab);
	}

	gs->queued = FALSE;
}


syntax highlighted by Code2HTML, v. 0.9.1