#include <stdlib.h>
#ifndef __FreeBSD__
#include <malloc.h>
#endif
#include <X11/xpm.h>
#include <stdio.h>
#include "list.h"
#include "leds.h"
#include "wmgeneral.h"

ListItem leds_array;
point Red_led,Yellow_led,Off_led,Green_led,Blue_led,Purple_led;


int init_leds(int led_offx, int led_offy,
	int led_redx, int led_redy,
	int led_yellowx, int led_yellowy,
	int led_greenx, int led_greeny,
	int led_bluex,int led_bluey,
	int led_purplex,int led_purpley)
{
	if (!ListInit(&leds_array))
		return -1;
		
	Off_led.x = led_offx; Off_led.y = led_offy;
	Red_led.x = led_redx; Red_led.y = led_redy;
	Yellow_led.x = led_yellowx; Yellow_led.y = led_yellowy;
	Green_led.x = led_greenx; Green_led.y = led_greeny;
	Blue_led.x = led_bluex; Blue_led.y = led_bluey;
	Purple_led.x = led_purplex; Purple_led.y = led_purpley;
	return 0;
}

struct led *add_led(int x,int y, int status)
{
	struct led *led;
	led=(struct led*)(malloc(sizeof(struct led)));
	if (!led) 
		return 0;
	led->x=x;
	led->y=y;
	led->current_status=status;
	led->last_status=-1; /* force display */
	ListInsert(&leds_array,led);
	return led;
}

int display_leds(int force_redraw)
{
	ListItem iterator;
	
	struct led *cled;
	point *color;
	
	int changed=0;
	
	for (iterator=leds_array; iterator; iterator=iterator->next) {
		cled=(struct led*)ListData(iterator);
	
		if (force_redraw || (cled->current_status != cled->last_status) || 
			(cled->current_status & LED_FLASHING)) {
			/* copy led */
			changed=1;		
			cled->last_status=cled->current_status;
			
			if (cled->current_status & LED_FLASHING) {
				if (cled->current_status & LED_FLASH_ON)
					cled->current_status&=~LED_FLASH_ON;
				else 
					cled->current_status|=LED_FLASH_ON;
			}
			switch(cled->current_status & 0x0F) {
				case LED_RED: color=&Red_led; break;
				case LED_YELLOW: color=&Yellow_led; break;
				case LED_GREEN: color=&Green_led; break;
				case LED_BLUE: color=&Blue_led; break;
				case LED_PURPLE: color=&Purple_led; break;
				case LED_OFF: color=&Off_led; break;
				default: color=&Off_led;
			}
			if (cled->current_status & LED_FLASHING)
			  if (cled->current_status & LED_FLASH_ON) 
			  	color=&Off_led;
			  	
			/* Draw led */
			
			copyXPMArea(color->x, color->y, 4, 4,
					cled->x, cled->y);
		} 
	}
	return changed;
}



syntax highlighted by Code2HTML, v. 0.9.1