changeset 426:50489ea9f4ec

[gaim-migrate @ 436] Stock Ticker, written by other people committer: Tailor Script <tailor@pidgin.im>
author Eric Warmenhoven <eric@warmenhoven.org>
date Fri, 23 Jun 2000 05:12:40 +0000
parents ae7c762775cd
children 42db8f317e9e
files plugins/gtik.c
diffstat 1 files changed, 1025 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/gtik.c	Fri Jun 23 05:12:40 2000 +0000
@@ -0,0 +1,1025 @@
+/*
+ *	GNOME Stock Ticker 
+ *	(C) 2000 Jayson Lorenzen, Jim Garrison, Rached Blili
+ *
+ *	based on:
+ *	desire, and the old great slash applet.
+ *	
+ *
+ *	Authors: Jayson Lorenzen (jaysonl@pacbell.net)
+ *               Jim Garrison (garrison@users.sourceforge.net)
+ *               Rached Blili (striker@Dread.net)
+ *
+ *	The Gnome Stock Ticker is a free, Internet based application. 
+ *      These quotes are not guaranteed to be timely or accurate.
+ *
+ *	Do not use the Gnome Stock Ticker for making investment decisions, 
+ *      it is for informational purposes only.
+ *
+ *      Modified by EWarmenhoven to become a gaim plugin. There was little
+ *      enough that needed to be changed that I can't really claim any credit.
+ *      (you need to add -lghttp to the GTK_LIBS part of the Makefile)
+ *      TODO: config, saving info
+ *
+ */
+
+#define GAIM_PLUGINS
+#include "gaim.h"
+
+#include <gtk/gtk.h>
+#include <time.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+
+#include "ghttp.h"
+#include <sys/stat.h>
+#include <unistd.h>
+#include <dirent.h>
+#include <gdk/gdkx.h>
+
+
+	GtkWidget *applet; /* this will become the main window */
+	GtkWidget *label;
+
+
+	static GdkPixmap *pixmap = NULL;
+	GtkWidget * drawing_area;
+
+	int location;
+	int MOVE;
+
+	char output[64];
+
+	/**
+	 * FOR COLOR
+	 * LEN and the length of output, and colorNum must match
+	 */
+	const int LEN = 20;
+	char outputArray[20][64];
+	char changeArray[20][64];
+	int colorArray[20];
+
+	const int RED = 1;
+	const int GREEN = 2;
+
+	static const int max_rgb_str_len = 7;
+	static const int max_rgb_str_size = 8;
+
+	int setCounter, getCounter, setColorCounter,getColorCounter;
+
+	GdkGC *gc;
+	GdkColor gdkUcolor,gdkDcolor;
+
+	/* end of COLOR vars */
+
+
+	char configFileName[256];
+
+
+	/*  properties vars */
+ 	 
+	GtkWidget *tik_syms_entry;
+	gchar tik_syms[256];
+
+	GtkWidget * pb = NULL;
+
+	typedef struct
+	{
+		char *tik_syms;
+		char *output;
+		char *scroll;
+		gint timeout;
+		gchar dcolor[8];
+		gchar ucolor[8];
+
+	} gtik_properties;
+
+	gtik_properties props = {"cald+rhat+corl","default","right2left",
+					5,"#ff0000","#00ff00"};
+
+	/* end prop vars */
+
+
+	gint timeout = 0;
+	gint drawTimeID, updateTimeID;
+	GdkFont * my_font;
+	GdkFont * extra_font;
+	GdkFont * small_font;
+	static gint symbolfont = 1;
+	static gint destroycb;
+
+
+	int configured();
+	void timeout_cb( GtkWidget *widget, GtkWidget *spin );
+	static int http_get_to_file(gchar *a_host, gint a_port, 
+				gchar *a_resource, FILE *a_file);
+	int http_got();
+	void properties_save( char *path) ;
+	void gaim_plugin_remove();
+
+
+	/* FOR COLOR */
+
+	void updateOutput() ;
+	static void reSetOutputArray() ;
+	static void setOutputArray(char *param1) ;
+	static void setColorArray(int theColor) ;
+	void setup_colors(void);
+	int create_gc(void) ;
+
+	/* end of color funcs */
+
+
+
+	/*-----------------------------------------------------------------*/
+	void remove_self(GtkWidget *w, void *handle)
+	{
+		gtk_signal_disconnect(GTK_OBJECT(applet), destroycb);
+		if (drawTimeID > 0) { gtk_timeout_remove(drawTimeID); }
+		if (updateTimeID >0) { gtk_timeout_remove(updateTimeID); }
+		gtk_widget_destroy(applet);
+		gaim_plugin_unload(handle);
+	}
+
+
+	/*-----------------------------------------------------------------*/
+	void load_fonts()
+	{
+		my_font = gdk_font_load ("fixed");
+		extra_font = gdk_font_load ("-urw-symbol-medium-r-normal-*-*-100-*-*-p-*-adobe-fontspecific");
+		small_font = gdk_font_load ("-schumacher-clean-medium-r-normal-*-*-100-*-*-c-*-iso8859-1");
+
+		/* If fonts do not load */
+		if (!my_font)
+			g_error("Could not load fonts!");
+		if (!extra_font) {
+			extra_font = gdk_font_load("fixed");
+			symbolfont = 0;
+		}
+		if (!small_font)
+			small_font = gdk_font_load("fixed");
+	}
+
+	/*-----------------------------------------------------------------*/
+	/*void load_properties( char *path) {
+
+
+		gnome_config_push_prefix (path);
+		if( gnome_config_get_string ("gtik/tik_syms") != NULL ) 
+		   props.tik_syms = gnome_config_get_string("gtik/tik_syms");
+		
+
+		timeout = gnome_config_get_int("gtik/timeout") > 0 ? gnome_config_get_int ("gtik/timeout") : props.timeout;
+	
+
+		if ( gnome_config_get_string ("gtik/output") != NULL ) 
+			props.output = gnome_config_get_string("gtik/output");
+		
+		if ( gnome_config_get_string ("gtik/scroll") != NULL ) 
+			props.scroll = gnome_config_get_string("gtik/scroll");
+		
+		if ( gnome_config_get_string ("gtik/ucolor") != NULL ) 
+		   strcpy(props.ucolor, gnome_config_get_string("gtik/ucolor"));
+		
+		if ( gnome_config_get_string ("gtik/dcolor") != NULL ) 
+		   strcpy(props.dcolor, gnome_config_get_string("gtik/dcolor"));
+		
+		gnome_config_pop_prefix ();
+	}*/
+
+
+
+	/*-----------------------------------------------------------------*/
+	/*void properties_save( char *path) {
+
+		gnome_config_push_prefix (path);
+		gnome_config_set_string( "gtik/tik_syms", props.tik_syms );
+		gnome_config_set_string( "gtik/output", props.output );
+		gnome_config_set_string( "gtik/scroll", props.scroll );
+		gnome_config_set_string( "gtik/ucolor", props.ucolor );
+		gnome_config_set_string( "gtik/dcolor", props.dcolor );
+
+		gnome_config_set_int("gtik/timeout",props.timeout);
+
+		gnome_config_pop_prefix ();
+		gnome_config_sync();
+		gnome_config_drop_all();
+	}*/	
+
+
+	/*-----------------------------------------------------------------*/
+	char * extractText(const char *line) {
+
+		int  i=0;
+		int  j=0;
+		static char Text[256]="";
+
+		while (i < (strlen(line) -1)) {
+			if (line[i] != '>')
+				i++;
+			else {
+				i++;
+				while (line[i] != '<') {
+					Text[j] = line[i];
+					i++;j++;
+				}
+			}
+		}
+		Text[j] = '\0';
+		i = 0;
+		while (i < (strlen(Text)) ) {
+			if (Text[i] < 32)
+				Text[i] = '\0';
+			i++;
+		}
+		return(Text);
+				
+	}
+
+	/*-----------------------------------------------------------------*/
+	char * parseQuote(FILE *CONFIG, char line[512]) {
+		
+		char symbol[512];
+		char buff[512];
+		char price[16];
+		char change[16];
+		char percent[16];
+		static char result[512]="";
+		int  linenum=0;
+		int AllOneLine=0;
+		int flag=0;
+		char *section;
+		char *ptr;
+
+		if (strlen(line) > 64) AllOneLine=1;
+
+		if (AllOneLine) {
+			strcpy(buff,line);
+			while (!flag) {
+				if ((ptr=strstr(buff,"</td>"))!=NULL) {
+					ptr[0] = '|';
+				}	
+				else flag=1;
+			}
+			section = strtok(buff,"|");
+		}
+		/* Get the stock symbol */
+		if (!AllOneLine) strcpy(symbol,extractText(line));
+		else strcpy(symbol,extractText(section));
+		linenum++;
+
+		/* Skip the time... */
+		if (!AllOneLine) fgets(line,255,CONFIG);
+		else section = strtok(NULL,"|");
+		linenum++;
+
+		while (linenum < 8 ) {
+			if (!AllOneLine) {
+				fgets(line,255,CONFIG);
+			
+				if (strstr(line,
+			  	 "<td align=center nowrap colspan=2>")) {
+					strcpy(change,"");
+					strcpy(percent,"");
+					linenum=100;
+				}
+			}
+			else {
+				section = strtok(NULL,"|");
+				if (strstr(section,
+			  	 "<td align=center nowrap colspan=2>")) {
+					strcpy(change,"");
+					strcpy(percent,"");
+					linenum=100;
+				}
+			}
+
+			if (linenum == 2) { 
+				if (!AllOneLine) 
+					strcpy(price,extractText(line));
+				else
+					strcpy(price,extractText(section));
+			}
+			else if (linenum == 3) {
+				if (!AllOneLine)
+					strcpy(change,extractText(line));
+				else
+					strcpy(change,extractText(section));
+
+				if (strstr(change,"-")) {
+					setColorArray(RED);
+				}
+				else if (strstr(change,"+")) {
+					setColorArray(GREEN);
+				}
+				else {
+					setColorArray(0);
+				}
+				
+			}
+			else if (linenum == 4) {
+				if (!AllOneLine) 
+					strcpy(percent,extractText(line));
+				else
+					strcpy(percent,extractText(section));
+			}
+			linenum++;
+		}
+		sprintf(result,"%s:%s:%s:%s",
+				symbol,price,change,percent);			
+		return(result);
+
+	}
+
+
+
+	/*-----------------------------------------------------------------*/
+	int configured() {
+		int retVar;
+
+		char  buffer[512];
+		static FILE *CONFIG;
+
+		CONFIG = fopen((const char *)configFileName,"r");
+
+		retVar = 0;
+
+		/* clear the output variable */
+		reSetOutputArray();
+
+		if ( CONFIG ) {
+			while ( !feof(CONFIG) ) {
+				fgets(buffer,511,CONFIG);
+
+				if (strstr(buffer,
+				    "<td nowrap align=left><a href=\"/q\?s=")) {
+
+				      setOutputArray(parseQuote(CONFIG,buffer));
+				      retVar = 1;
+				}
+				else {
+				      retVar = (retVar > 0) ? retVar : 0;
+				}
+			}
+			fclose(CONFIG);
+
+		}
+		else {
+			retVar = 0;
+		}
+
+		return retVar;
+	}
+
+
+	/*-----------------------------------------------------------------*/
+	/* Shamelessly stolen from the Slashapp applet
+	 */
+	static int http_get_to_file(gchar *a_host, gint a_port, 
+				    gchar *a_resource, FILE *a_file) {
+		int length = -1;
+		ghttp_request *request = NULL;
+		gchar s_port[8];
+		gchar *uri = NULL;
+		gchar *body;
+		gchar *proxy = g_getenv("http_proxy");
+
+		g_snprintf(s_port, 8, "%d", a_port);
+		uri = g_strconcat("http://", a_host, ":", s_port, 
+						a_resource, NULL);
+
+		fprintf(stderr,"Asking for %s\n", uri);
+
+		request = ghttp_request_new();
+		if (!request)
+			goto ec;
+		if (proxy && (ghttp_set_proxy(request,proxy) != 0))
+			goto ec;
+
+		if (ghttp_set_uri(request, uri) != 0)
+			goto ec;
+		ghttp_set_header(request, http_hdr_Connection, "close");
+		if (ghttp_prepare(request) != 0)
+			goto ec;
+		if (ghttp_process(request) != ghttp_done)
+			goto ec;
+		length = ghttp_get_body_len(request);
+		body = ghttp_get_body(request);
+		if (body != NULL)
+			fwrite(body, length, 1, a_file);
+
+		ec:
+			if (request)
+				ghttp_request_destroy(request);
+			if (uri)
+				
+				g_free(uri);
+		return length;
+	}
+
+
+
+
+	/*-----------------------------------------------------------------*/
+	int http_got() {
+
+		int retVar;
+		FILE *local_file;
+
+		char tmpBuff[256];
+		memset(tmpBuff,0,sizeof(tmpBuff));
+
+		strcat(tmpBuff,"/q?s=");
+		strcat(tmpBuff, props.tik_syms);
+		strcat(tmpBuff,"&d=v2");
+
+		retVar = 0;
+
+		local_file = fopen(configFileName, "w");
+		retVar = http_get_to_file("finance.yahoo.com", 80, 
+						tmpBuff, local_file);
+
+		fclose(local_file);
+
+		return retVar;
+	}
+
+
+
+
+
+	/*-----------------------------------------------------------------*/
+	gint expose_event (GtkWidget *widget,GdkEventExpose *event) {
+
+		gdk_draw_pixmap(widget->window,
+		widget->style->fg_gc[GTK_WIDGET_STATE(widget)],
+		pixmap,
+		event->area.x, event->area.y,
+		event->area.x, event->area.y,
+		event->area.width,event->area.height);
+
+		return FALSE;
+	}
+
+
+
+	/*-----------------------------------------------------------------*/
+	static gint configure_event(GtkWidget *widget,GdkEventConfigure *event){
+
+		if(pixmap) {
+			gdk_pixmap_unref (pixmap);
+		}
+
+		pixmap = gdk_pixmap_new(widget->window,
+		widget->allocation.width,
+		widget->allocation.height,
+		-1);
+
+		return TRUE;
+	}
+
+
+
+
+
+
+	/*-----------------------------------------------------------------*/
+	gint Repaint (gpointer data) {
+		GtkWidget* drawing_area = (GtkWidget *) data;
+		GdkRectangle update_rect;
+		int	comp;
+
+		/* FOR COLOR */
+		char *tmpSym;
+		int totalLoc;
+		int totalLen;
+		int i;
+
+
+		totalLoc = 0;
+		totalLen = 0;
+
+		/* clear the pixmap */
+		gdk_draw_rectangle (pixmap,
+		drawing_area->style->black_gc,
+		TRUE,
+		0,0,
+		drawing_area->allocation.width,
+		drawing_area->allocation.height);
+
+
+		for(i=0;i<LEN;i++) {
+			totalLen += strlen(outputArray[i]);
+		}
+		if (!strcmp(props.output,"default")) {
+			for(i=0;i<LEN;i++) {
+				totalLen += strlen(changeArray[i]);
+			}
+		}
+
+		comp = 1 - ( totalLen *8 );
+
+		if (MOVE == 1) { MOVE = 0; } else { MOVE = 1; }
+
+		if (MOVE == 1) {
+
+
+		  if (!strcmp(props.scroll,"right2left")) {
+			if (location > comp) {
+				location--;
+			}
+			else {
+				location = drawing_area->allocation.width;
+			}
+
+		  }
+		  else {
+                       if (location < drawing_area->allocation.width) {
+                                location ++;
+                        }
+                        else {
+                                location = comp;
+                        }
+		  }
+
+
+
+		}
+
+		for (i=0;i<LEN;i++) {
+
+			/* COLOR */
+			if (colorArray[i] == GREEN) {
+				gdk_gc_set_foreground( gc, &gdkUcolor );
+			}
+			else if (colorArray[i] == RED) {
+				gdk_gc_set_foreground( gc, &gdkDcolor );
+			}
+			else {
+				gdk_gc_copy( gc, drawing_area->style->white_gc );
+			}
+
+			tmpSym = outputArray[i];
+			gdk_draw_string (pixmap,my_font,
+			gc,
+			location + (totalLoc * 6 ) ,12,outputArray[i]);
+			totalLoc += (strlen(tmpSym) + 1); 
+
+
+			if (!strcmp(props.output,"default")) {
+				tmpSym = changeArray[i];
+				if (*(changeArray[i]))
+					gdk_draw_text (pixmap,extra_font,
+					     gc, location + (totalLoc * 6) ,
+					     12,changeArray[i],1);
+				gdk_draw_string (pixmap,small_font,
+				     gc, location + ((totalLoc +2) * 6) ,
+				     12, &changeArray[i][1]);
+				totalLoc += (strlen(tmpSym) + 1); 
+			}
+			
+		}
+		update_rect.x = 0;
+		update_rect.y = 0;
+		update_rect.width = drawing_area->allocation.width;
+		update_rect.height = drawing_area->allocation.height;
+
+		gtk_widget_draw(drawing_area,&update_rect);
+		return 1;
+	}
+
+
+
+
+	/*-----------------------------------------------------------------*/
+	char *description() {
+		return
+		" This program uses ghttp to connect to "
+		"a popular stock quote site, then downloads "
+		"and parses the html returned from the "
+		"site to scroll delayed quotes"
+		"\n\n The Gnome Stock Ticker is a free, Internet based application. These quotes are not "
+		"guaranteed to be timely or accurate. "
+		"Do not use the Gnome Stock Ticker for making investment decisions; it is for "
+		"informational purposes only."
+		"\n\n (C) 2000 Jayson Lorenzen, Jim Garrison, Rached Blili";
+	}
+
+	char *name() {
+		return "The Gnome Stock Ticker for GAIM";
+	}
+
+
+
+
+
+
+	/*-----------------------------------------------------------------*/
+	void changed_cb(GtkWidget *pb, gpointer data) {
+		/* gnome_property_box_changed(GNOME_PROPERTY_BOX(pb)); */
+	}
+
+
+	/*-----------------------------------------------------------------*/
+	void toggle_output_cb(GtkWidget *widget, gpointer data) {
+		if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
+			props.output = g_strdup("nochange");
+		else
+			props.output = g_strdup("default");
+			
+	}
+
+	/*-----------------------------------------------------------------*/
+	void toggle_scroll_cb(GtkWidget *widget, gpointer data) {
+		if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(widget)))
+			props.scroll = g_strdup("left2right");
+		else
+			props.scroll = g_strdup("right2left");
+			
+	}
+
+	/*-----------------------------------------------------------------*/
+	void timeout_cb( GtkWidget *widget, GtkWidget *spin ) {
+		timeout=gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(spin));
+		/* gnome_property_box_changed(GNOME_PROPERTY_BOX(pb)); */
+	}
+
+
+
+
+	/*-----------------------------------------------------------------*/
+	static void apply_cb( GtkWidget *widget, void *data ) {
+		char *tmpText;
+
+
+		tmpText = gtk_entry_get_text(GTK_ENTRY(tik_syms_entry));
+		props.tik_syms = g_strdup(tmpText);
+		if  (props.timeout) {	
+			props.timeout = timeout > 0 ? timeout : props.timeout;
+		}
+
+		/* properties_save(APPLET_WIDGET(applet)->privcfgpath); */
+
+		setup_colors();		
+		updateOutput();
+	}
+
+
+
+
+	/*-----------------------------------------------------------------*/
+	gint destroy_cb( GtkWidget *widget, void *data ) {
+		pb = NULL;
+		return FALSE;
+	}
+
+
+
+	/*-----------------------------------------------------------------*/
+	void gaim_plugin_config() {
+		GtkWidget * vbox;
+		GtkWidget *urlcheck, *launchcheck;
+
+		GtkWidget *panela, *panel1 ,*panel2, *panel3, *panel4;
+		GtkWidget *label1,*label2,*label3 ;
+
+
+		GtkWidget *timeout_label,*timeout_c;
+		GtkObject *timeout_a;
+
+		GtkWidget *upColor, *downColor, *upLabel, *downLabel;
+		GtkWidget *check,*check2;
+
+		int ur,ug,ub, dr,dg,db; 
+
+		if (pb) return;
+		pb = gtk_window_new(GTK_WINDOW_TOPLEVEL);
+
+		gtk_window_set_title(GTK_WINDOW(pb), _("Gnome Stock Ticker Properties"));
+
+		vbox = gtk_vbox_new(FALSE, 8);
+
+		panela = gtk_hbox_new(FALSE, 5);
+		panel1 = gtk_hbox_new(FALSE, 5);
+		panel2 = gtk_hbox_new(FALSE, 5);
+		panel3 = gtk_hbox_new(FALSE, 5);
+		panel4 = gtk_hbox_new(FALSE, 5);
+
+		gtk_container_set_border_width(GTK_CONTAINER(vbox), 8);
+
+		timeout_label = gtk_label_new(_("Update Frequency in min"));
+		timeout_a = gtk_adjustment_new( timeout, 0.5, 128, 1, 8, 8 );
+		timeout_c  = gtk_spin_button_new( GTK_ADJUSTMENT(timeout_a), 1, 0 );
+
+		gtk_box_pack_start_defaults( GTK_BOX(panel2), timeout_label );
+		gtk_box_pack_start_defaults( GTK_BOX(panel2), timeout_c );
+	
+		gtk_signal_connect_object(GTK_OBJECT(timeout_c), "changed",GTK_SIGNAL_FUNC(changed_cb),GTK_OBJECT(pb));
+
+		gtk_signal_connect( GTK_OBJECT(timeout_a),"value_changed",
+		GTK_SIGNAL_FUNC(timeout_cb), timeout_c );
+		gtk_signal_connect( GTK_OBJECT(timeout_c),"changed",
+		GTK_SIGNAL_FUNC(timeout_cb), timeout_c );
+		gtk_spin_button_set_update_policy( GTK_SPIN_BUTTON(timeout_c),
+		GTK_UPDATE_ALWAYS );
+
+		label1 = gtk_label_new(_("Enter symbols delimited with \"+\" in the box below."));
+
+		tik_syms_entry = gtk_entry_new_with_max_length(60);
+
+		/* tik_syms var is her if want a default value */
+		gtk_entry_set_text(GTK_ENTRY(tik_syms_entry), props.tik_syms ? props.tik_syms : tik_syms);
+		gtk_signal_connect_object(GTK_OBJECT(tik_syms_entry), "changed",GTK_SIGNAL_FUNC(changed_cb),GTK_OBJECT(pb));
+
+		/* OUTPUT FORMAT and SCROLL DIRECTION */
+
+		label2 = gtk_label_new(_("Check this box to display only symbols and price:"));
+		label3 = gtk_label_new(_("Check this box to scroll left to right:"));
+		check = gtk_check_button_new();
+		check2 = gtk_check_button_new();
+		gtk_box_pack_start_defaults(GTK_BOX(panel3),label2);
+		gtk_box_pack_start_defaults(GTK_BOX(panel3),check);
+		gtk_box_pack_start_defaults(GTK_BOX(panel4),label3);
+		gtk_box_pack_start_defaults(GTK_BOX(panel4),check2);
+
+		/* Set the checkbox according to current prefs */
+		if (strcmp(props.output,"default")!=0)
+			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check),
+							TRUE);
+		gtk_signal_connect_object(GTK_OBJECT(check),"toggled",
+				GTK_SIGNAL_FUNC(changed_cb),GTK_OBJECT(pb));
+		gtk_signal_connect(GTK_OBJECT(check),"toggled",
+				GTK_SIGNAL_FUNC(toggle_output_cb),NULL);
+
+		/* Set the checkbox according to current prefs */
+		if (strcmp(props.scroll,"right2left")!=0)
+			gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(check2),
+							TRUE);
+		gtk_signal_connect_object(GTK_OBJECT(check2),"toggled",
+				GTK_SIGNAL_FUNC(changed_cb),GTK_OBJECT(pb));
+		gtk_signal_connect(GTK_OBJECT(check2),"toggled",
+				GTK_SIGNAL_FUNC(toggle_scroll_cb),NULL);
+
+		/* COLOR */
+/*		upLabel = gtk_label_new(_("+ Color"));
+		upColor = gnome_color_picker_new();
+	
+		sscanf( props.ucolor, "#%02x%02x%02x", &ur,&ug,&ub );
+	
+		gnome_color_picker_set_i8(GNOME_COLOR_PICKER (upColor), 
+					  ur, ug, ub, 255);
+		
+		gtk_signal_connect(GTK_OBJECT(upColor), "color_set",
+				GTK_SIGNAL_FUNC(ucolor_set_cb), NULL);
+
+		gtk_box_pack_start_defaults( GTK_BOX(panela), upLabel );
+		gtk_box_pack_start_defaults( GTK_BOX(panela), upColor );
+
+		downLabel = gtk_label_new(_("- Color"));
+		downColor = gnome_color_picker_new();
+
+		sscanf( props.dcolor, "#%02x%02x%02x", &dr,&dg,&db );
+
+		gnome_color_picker_set_i8(GNOME_COLOR_PICKER (downColor), 
+					  dr, dg, db, 255);
+
+		gtk_signal_connect(GTK_OBJECT(downColor), "color_set",
+				GTK_SIGNAL_FUNC(dcolor_set_cb), NULL);
+
+		gtk_box_pack_start_defaults( GTK_BOX(panela), downLabel );
+		gtk_box_pack_start_defaults( GTK_BOX(panela), downColor );
+
+*/
+		gtk_box_pack_start(GTK_BOX(panel1), label1, FALSE, 
+				   FALSE, 8);
+
+		gtk_box_pack_start(GTK_BOX(vbox), panel2, FALSE,
+				    FALSE, 8);
+		gtk_box_pack_start(GTK_BOX(vbox), panel3, FALSE,
+				    FALSE, 8);
+		gtk_box_pack_start(GTK_BOX(vbox), panel4, FALSE,
+				    FALSE, 8);
+		gtk_box_pack_start(GTK_BOX(vbox), panela, FALSE,
+				    FALSE, 8);
+		gtk_box_pack_start(GTK_BOX(vbox), panel1, FALSE,
+				    FALSE, 8);
+
+		gtk_box_pack_start(GTK_BOX(vbox), tik_syms_entry,
+				    FALSE, FALSE, 8);
+
+		gtk_container_add(GTK_CONTAINER(pb), vbox);
+
+		gtk_signal_connect_object(GTK_OBJECT(tik_syms_entry), 
+				   "changed",GTK_SIGNAL_FUNC(changed_cb),
+				   GTK_OBJECT(pb));
+
+		gtk_signal_connect(GTK_OBJECT(pb), "apply",
+				    GTK_SIGNAL_FUNC(apply_cb), NULL);
+
+		gtk_widget_show_all(pb);
+	}
+
+
+
+
+
+	/*-----------------------------------------------------------------*/
+	int gaim_plugin_init(void *handle) { /* used to be main() */
+		GtkWidget *label;
+
+		GtkWidget * vbox;
+
+		memset(configFileName,0,sizeof(configFileName));
+		strcat(configFileName, getenv("HOME"));
+		strcat(configFileName, "/.gtik.conf");
+
+		applet = gtk_window_new(GTK_WINDOW_TOPLEVEL); /* or not */
+
+		vbox = gtk_hbox_new (FALSE,0);
+
+		drawing_area = gtk_drawing_area_new();
+		gtk_drawing_area_size(GTK_DRAWING_AREA (drawing_area),200,20);
+
+		gtk_widget_show(drawing_area);
+		gtk_box_pack_start(GTK_BOX (vbox), drawing_area,TRUE,TRUE,0);
+
+		gtk_widget_show(vbox);
+
+		/* applet_widget_add (APPLET_WIDGET (applet), vbox); */
+		gtk_container_add(GTK_CONTAINER(applet), vbox);
+
+		gtk_signal_connect(GTK_OBJECT(drawing_area),"expose_event",
+		(GtkSignalFunc) expose_event, NULL);
+
+		gtk_signal_connect(GTK_OBJECT(drawing_area),"configure_event",
+		(GtkSignalFunc) configure_event, NULL);
+
+
+		destroycb = gtk_signal_connect(GTK_OBJECT(applet), "destroy",
+			GTK_SIGNAL_FUNC(remove_self), handle);
+
+
+
+		gtk_widget_show (applet);
+		create_gc();
+
+		/* load_properties(APPLET_WIDGET(applet)->privcfgpath); */
+
+		setup_colors();
+		load_fonts();		
+		updateOutput();
+
+
+		/* KEEPING TIMER ID FOR CLEANUP IN DESTROY */
+		drawTimeID   = gtk_timeout_add(2,Repaint,drawing_area);
+		updateTimeID = gtk_timeout_add(props.timeout * 60000,
+				   (gpointer)updateOutput,"NULL");
+
+
+		return 0;
+	}
+
+
+
+	/*-----------------------------------------------------------------*/
+	void updateOutput() {
+		if ( http_got() == -1 || !(configured()) ) {  
+			reSetOutputArray();
+			printf("No data!\n");
+			setOutputArray("No data available or properties not set");
+		}
+	}
+
+
+
+
+/* JHACK */
+	/*-----------------------------------------------------------------*/
+	void gaim_plugin_remove() {
+		gtk_signal_disconnect(GTK_OBJECT(applet), destroycb);
+		if (drawTimeID > 0) { gtk_timeout_remove(drawTimeID); }
+		if (updateTimeID >0) { gtk_timeout_remove(updateTimeID); }
+		gtk_widget_destroy(applet);
+	}
+
+
+
+
+	
+/*HERE*/
+	/*-----------------------------------------------------------------*/
+	static void reSetOutputArray() {
+		int i;
+		
+		for (i=0;i<LEN;i++) {
+			/* CLEAR EACH SYMBOL'S SPACE */
+			memset(outputArray[i],0,sizeof(outputArray[i]));
+
+			/* CLEAR ASSOC COLOR ARRAY */
+			colorArray[i] = 0;
+
+			/* CLEAR ADDITIONAL INFO */
+			memset(changeArray[i],0,sizeof(changeArray[i]));
+
+		}
+
+		setCounter = 0;
+		getCounter = 0;
+		setColorCounter = 0;
+		getColorCounter = 0;
+		
+	}	
+
+
+	/*-----------------------------------------------------------------*/
+	char *splitPrice(char *data) {
+		char buff[128]="";
+		static char buff2[128]="";
+		char *var1, *var2;
+		int i;
+
+		strcpy(buff,data);
+		var1 = strtok(buff,":");
+		var2 = strtok(NULL,":");
+
+		sprintf(buff2,"  %s %s",var1,var2);
+		return(buff2);
+	}
+
+	/*-----------------------------------------------------------------*/
+	char *splitChange(char *data) {
+		char buff[128]="";
+		static char buff2[128]="";
+		char *var1, *var2, *var3, *var4;
+		int i;
+
+		strcpy(buff,data);
+		var1 = strtok(buff,":");
+		var2 = strtok(NULL,":");
+		var3 = strtok(NULL,":");
+		var4 = strtok(NULL,"");
+
+		if (var3[0] == '+') { 
+			if (symbolfont)
+				var3[0] = 221;
+			var4[0] = '(';
+		}
+		else if (var3[0] == '-') {
+			if (symbolfont)
+				var3[0] = 223;	
+			var4[0] = '(';
+		}
+		else {
+			var3 = strdup(_("(No"));
+			var4 = strdup(_("Change"));
+		}
+
+		sprintf(buff2,"%s %s)",var3,var4);
+		return(buff2);
+	}
+
+	/*-----------------------------------------------------------------*/
+	static void setOutputArray(char *param1) {
+		char *price;
+		char *change;
+
+		price = splitPrice(param1);
+		change = splitChange(param1);
+
+		if (setCounter < LEN) {
+			
+			strcpy(outputArray[setCounter],price);
+			strcpy(changeArray[setCounter],change);
+		}
+		setCounter++;
+	}
+
+
+
+	/*-----------------------------------------------------------------*/
+	static void setColorArray(int theColor) {
+		if (setColorCounter < LEN) {
+			colorArray[setColorCounter] = theColor;
+		}
+		setColorCounter++;
+	}
+
+	void setup_colors(void) {
+		GdkColormap *colormap;
+
+		colormap = gtk_widget_get_colormap(drawing_area);
+
+		gdk_color_parse(props.ucolor, &gdkUcolor);
+		gdk_color_alloc(colormap, &gdkUcolor);
+
+		gdk_color_parse(props.dcolor, &gdkDcolor);
+		gdk_color_alloc(colormap, &gdkDcolor);
+	}
+
+	
+	int create_gc(void) {
+		gc = gdk_gc_new( drawing_area->window );
+		gdk_gc_copy( gc, drawing_area->style->white_gc );
+		return 0;
+	}